GeekFactory

int128.hatenablog.com

Renovate で特定のパッケージを同時に上げる

Renovate で特定のパッケージ群のバージョンを同時に上げる方法を調べたのでメモです。 解決したい課題 TypeScript GitHub Action で以下のパッケージのバージョンアップを個別に受け取るので CI が失敗してしまう。auto merge できない。 jest jest-circus …

Pull Request Review 情報を API で取得する

Pull Request のレビューで Code Owner が設定されているかどうかを取得する方法を調べたのでメモ。 GraphQL API の ReviewRequest オブジェクトで Code Owner かどうか取得できます。クエリの例を書いておきます。 query { repository(owner: "OWNER", name…

GitHub Actions で Issue を Project に追加する

カンバンをうまく運用するには自動化の仕組みが不可欠です。Issue や Pull Request を作ったのにカンバンに入れていなくて忘れ去っていたということ、ありますよね。本稿では GitHub に Issue や Pull Request が作成された契機で Project に自動的に追加す…

Envoy OAuth2 Filterを試す(未完)

EnvoyのOAuth2 Filterを試してみました。残念ながら期待通りに動きませんでした。メモだけ残しておきます。 www.envoyproxy.io 構成 EKS 1.18 Envoy 1.17.0-dev-483dd3 以下のトラフィックパスを構築します。 Browser ↓ Internet-facing ALB ↓ Service/NodeP…

EKS Managed Node GroupでSpot Instancesを使う

Amazon EKSのManaged Node Groupsがスポットインスタンスに対応しました。 aws.amazon.com これまでManaged Node Groupsではオンデマンドしか利用できず、スポットを利用するには自分でAuto Scaling Groups(mixed instance types)を管理する必要がありまし…

AWS SSOでサードパーティツールを実行する

AWS SSOを利用すると、IAM Access KeyやIAM Secret Access Keyの代わりにブラウザベースの認証を利用してAWS APIにアクセスできます。一方で、AWS SSOに対応しているものはAWS CLI v2ぐらいしかなく、Terraformなどのサードパーティツールはそのままでは使え…

CircleCIのmacOSビルドをOSSで利用する

kubelogin というKubernetes向けのツールをOSSで開発しているのですが、Goのビルド条件によって動作が異なる問題 *1 が出てきて、macOSでビルドを実行する必要が出てきました。ちょうど下記の記事でCircleCIがOSS向けにmacOSをサポートしていることを知りま…

Certified Kubernetes Administratorを取得した

Certified Kubernetes Administrator(CKA)を取得しました。すでに多くの受験記があるので、他の人が書いていないことをまとめてみます。 きっかけ いろんな言い訳でCKAの申し込みを先延ばしにしてきたのですが、以下の条件が揃ったので受験するに至りまし…

Terraformでcloud-configを記述する

AWSのEC2インスタンスでは、User Dataにシェルスクリプトを渡すことで起動時にスクリプトを実行できます。ファイルを配置したり、パッケージをインストールしたり、といった複雑なことがやりたい場合はcloud-initが便利です。詳しくは公式ドキュメントの例を…

Homebrew FormulaをCircleCIでテストする

Homebrew Formulaは一度書くと変更する機会があまりないですが、外部からPRを受け付ける場合はCIでテストしておくと便利です。linuxbrew/linuxbrew イメージを利用すると、LinuxのCI runnerでもbrewコマンドを利用できます。 CircleCIの場合は下記の設定でFo…

IAM Roles for Service Accountsに必要なリソースを作成するTerraformモジュールを書いた

kopsなどで自前構築しているKubernetesクラスタでIAM Roles for Service Accounts(IRSA)を利用する時に必要なAWSリソースを作成するTerraformモジュールを書きました。 github.com kopsとTerraformの組み合わせでIRSAを利用する方法は下記の記事を参考にさ…

Prometheus Alertmanagerの通知テンプレートを改善する

AlertmanagerのSlack通知テンプレートで四苦八苦したのでメモを残します。 Prometheus OperatorのHelm chartには便利なデフォルトルールが組み込まれています。例えば、Podが頻繁に再起動している場合に通知するルール(KubePodCrashLooping)が組み込まれて…

Fluxによるアプリケーションの継続的デプロイ

FluxのAutomated deployment of new container imagesを利用して、Kubernetes上でアプリケーションの継続的デプロイを構成する機会があったのでまとめます。 GitOpsの基本形 GitOpsを採用する場合は下図のデプロイフローが基本形になります。 具体的には以下…

本物のクラスタを利用してkubectl pluginをテストする

kubectlのプラグインを開発していると、ユニットテストだけでなく、本物のKubernetesクラスタを利用したテストが欲しくなります。プラグインの振る舞いが複雑な場合は自動テストがあると安心してリリースできます。 本稿では、本物のKubernetesクラスタを利…

決済手段を選択するビジネスルールを考える

お店やネットで買い物する時のビジネスルールが複雑になってきたので書き出してみました。 以下の順に評価して条件を満たす決済手段で支払います。 USD/EUR建ての場合:Sony Bank WALLET ANA FESTAの場合:ソラチカカードVisa(5%割引) ビックカメラの場合…

kindでクラスタが起動しない原因を調べる

kind create cluster コマンドでKubernetesクラスタが起動しない場合、以下のようなメッセージが表示されます。 ✗ Starting control-plane ️ ERROR: failed to create cluster: failed to init node with kubeadm: command "docker exec --privileged kind-c…

GitHub GraphQLで新しいPull Requestを作成する

GitHub GraphQLで新しいPull Requestを作成するにはcreatePullRequest mutationを利用します。RESTの場合と同様に、以下のようにheadとbaseを指定します。 head ref: 適用したい変更が含まれるブランチ。cross repositoryの場合はforkされたリポジトリ。 bas…

アプリケーションの開発フローとGitOps

アプリケーションの開発フローとKubernetesへのデプロイを考えた軌跡を残します。特に結論はないです。 前提 以下を前提とする。 Kubernetesにアプリケーションをデプロイする場合を考える。 すべての変更はPull Requestを通して適用する。 アプリケーション…

GitHub GraphQL APIで新しいブランチを作成する

GitHub GraphQL APIで新しいブランチを作成できるようになっていたので試してみました。本記事の内容はGraphQL API Explorerで実行できます。 リポジトリに新しいブランチやタグを作成するにはcreateRef mutationを利用します。createRefを実行するには以下…

Kubernetes DashboardとAWS IAM認証

Amazon EKS #1 Advent Calendar 2019の13日目です。今日はKubernetes DashboardとIAM認証についてお話しします。 背景 Kubernetesのクラスタをチームで運用する場合、チーム全員がコマンドラインツールに習熟しているとは限らないため、GUIツールを併用する…

GitLab CI/CDでtfnotifyを使う

mercari/tfnotifyがv0.3.2でGitLab CI/CDに対応したので試してみました。個人的には待望の機能追加です。tfnotifyを利用すると、GitLab CI/CDでTerraformを実行した結果をMerge Requestのコメントに反映できます。いちいちジョブの結果を見に行かなくてよい…

Cluster AutoscalerをPrometheusでモニタリングする

Cluster Autoscalerを運用していると,ノード数が増減した契機を調査したいことがあります.Cluster Autoscalerは大量のログを出力するため,闇雲にログを追うのは大変です.PrometheusとGrafanaでCluster Autoscalerの動作を可視化しておくと調査しやすくな…

ffmpegでmovをgifに変換する

QuickTimeで画面収録したmovファイルをgifファイルに変換する方法です。 Docker Hubの jrottenberg/ffmpeg イメージを利用します。以下を実行すると、サイズやフレームレートをそのままにしてファイルを変換します。 docker run --rm -v $PWD:/src jrottenbe…

実行中のゴルーチンでwg.Add(1)/eg.Go()を実行すると,Wait()は呼び出し後に追加されたゴルーチンも待ってくれるか?

Goで並行処理のコードを書いている時に以下の疑問が思い浮かびました. sync.WaitGroupを利用する場合,実行中のゴルーチンでwg.Add(1)を実行すると,wg.Wait()は呼び出し後に追加されたゴルーチンも待ってくれるか? errgroup.Grpupを利用する場合,実行中…

kube2iamをTerraformとHelmfileでデプロイする

Kubernetes workerをEC2インスタンスで実行する場合,何も設定しないとPodはEC2インスタンスのIAMロールを利用します.このままでは,攻撃者が悪意のあるイメージを利用して情報漏洩や破壊を行うリスクがあります.kube2iamを利用すると,Podに適切なIAMロー…

TerraformでNATインスタンスを管理する

個人のAWS環境でプライベートサブネット構成を検証したいけどNATゲートウェイに毎月3,500円も払えない*1ので,NATインスタンスのTerraformモジュール int128/nat-instance/aws を作りました.主な特徴はこちらです. Auto Scaling GroupによるAuto Healingに…

Argo CDでGitLab SSOを利用する

Argo CDは自前でユーザ管理の仕組みを持たず*1,外部のIdentity Providerに認証を移譲するという設計思想になっています.Argo CDのHelm chartにはDexがバンドルされており,様々なIdentity Providerと連携させることが可能です.本稿では,Argo CDでGitLab …

AWS Cluster AutoscalerをTerraformとHelmfileでデプロイする

Cluster Autoscalerを利用すると,CPUやメモリの要求量に応じてノード数を自動的に増減させることが可能です. 本稿では,Amazon EKSで以下を利用する方法を紹介します. terraform-aws-eks Module AWS Cluster Autoscaler stable/cluster-autoscaler Helm C…

GitLab RunnerとkanikoでDockerイメージをビルドする

DockerやKubernetesでGitLab Runnerを実行する場合,GitLab RunnerでDockerイメージをビルドするにはDocker in Dockerの特権モードを構成する必要があります.kanikoを利用すると,特権モードを使わずにDockerイメージをビルドできます. 本稿では,GitLab R…

terraform-aws-modules/acm/aws でTLS証明書を取得する

terraform-aws-modules/acm/aws を使うとACMの証明書を簡単に取得できます.コンソール作業が一切必要ないのがうれしい. 例えば,ドメイン foo.example.com のRoute53 Hosted Zoneが存在する前提で *.foo.example.com のTLS証明書を取得するには,以下のコ…