Crossplane / Upbound にコントリビュートする方法
Crossplane とは、KubernetesからTerraformライクにIaaSをコントロールすることができるコンポーネントです。 特に多くなるであろうユースケースがCrossplaneからAWSのリソースを管理できるようにするものです。
まだ若いプロジェクトなので、どうしても期待した動作にならないことが多いです。その場合はパッチを自作するか、自分からコミュニティに貢献をすることがおすすめです。
ここでは Crossplane の Upbound/Provider AWS をカスタマイズ・プルリクをあげるために必要だったことのメモを記載します。
ちなみにあんまりちゃんと手順が書いていなかったと思うのですが、このプルリクにかかれている内容が参考になりました。
https://github.com/upbound/provider-aws/pull/814
カスタマイズ手順
1. 手元にレポジトリをClone
1https://github.com/upbound/provider-aws
2. コードをIDEで開く
コードは Go 言語なので、なんらかのIDEを使って開くことをおすすめ。筆者はIntellijを使用。
3. いじっていい場所を把握する
細かくは調べていないのですが、コード生成のフレームワークをつかっているため、エディットしてはいけない箇所がほとんどです。 (いじってもビルド時にRevertしてしまう)
基本的に手で修正していい箇所は config
ディレクトリ以下のコードのようです。
コードの仕組み自体は細かく触れませんが、私が実施したプルリクを参考にしてください。
https://github.com/upbound/provider-aws/pull/826/files
このPRなんかも、config
以下のコードを触っているだけであり、残りの差分はビルド時に自動生成された箇所です。
https://github.com/upbound/provider-aws/pull/831/files
4. いじった箇所をローカルで試す
若干ハックがあるものの、以下のコマンドで、パソコン上で試すことができます。 (前提として手元にterraformのCLIがインストールされていること)
まず goimports をインストールします。
1go install golang.org/x/tools/cmd/goimports@latest
同じプロンプトでやると goimports がないままのケースがあるので、別プロンプトで起動。
その後、コードを生成
1make generate
AWS のリソースを管理する場合、IRSAを使って権限を取得することが望ましいですが、以下のような環境変数をエクスポートすることでIRSAが使えます。
1export AWS_STS_REGIONAL_ENDPOINTS=regional
2export AWS_DEFAULT_REGION=us-west-1
3export AWS_REGION=us-west-1
4export AWS_ROLE_ARN=<role>
5export AWS_WEB_IDENTITY_TOKEN_FILE=./token
そして起動
1export KUBECONFIG=<kubeconfig>
2make run
AWSを管理する場合、デフォルトではmonolith
オブジェクトが起動してしまい、必要以上のオブジェクトが起動してきてしまいます。
Makefile
の以下の箇所をいじった後にmake run
すれば起動するものをおさえることができます。
5. 編集が完了したコンテナイメージを作成する
ビルドには大前提 go が必要なので、インストールと GO_ROOT
を設定する。
(Intellij の場合、$HOME/sdk 以下のインストールされたものを利用)
編集した部分だけをビルドして作っていきます。 テストを行うKubernetesからアクセスできるレポジトリを用意して以下のコマンドを実行します。
1make submodules
2export DOCKER_REGISTRY=ghcr.io/mhoshi-vm/custom-upbound
3export BUILD_REGISTRY=ghcr.io/mhoshi-vm/custom-upbound
4export XPKG_REG_ORGS=ghcr.io/mhoshi-vm/custom-upbound
5export REGISTRY_ORGS=ghcr.io/mhoshi-vm/custom-upbound
そして以下のコマンドでビルドします。ポイントがSUBPACKAGES
でビルド対象をおさえていることです。特にProvider AWSはかなりのモジュールが多いので必要なもののみに抑えるのがおすすめです。
とはいえ、特定のプラグインだけバージョンが違うことは認められていないようです。
なので、編集したものとあわせ、実際に環境で使用するプラグインも指定します。
この例では、ecs
とec2
とelbv2
をビルド。
1make build.all publish BRANCH_NAME=main SUBPACKAGES="ecs ec2 elbv2 config"
6. あとは Crossplane で動作をためす
あとは通常通りにインストールするだけ
https://marketplace.upbound.io/providers/upbound/provider-family-aws/v0.45.0
この際に、kind: Provider
に一個前に作ったコンテナイメージを指定します。
1cat <<EOF | kubectl apply -f -
2apiVersion: pkg.crossplane.io/v1
3kind: Provider
4metadata:
5 name: provider-aws-ecs
6spec:
7 package: ghcr.io/mhoshi-vm/custom-upbound/provider-aws-ecs:<version>
8EOF
あとは動作を確認したり、アップストリームに貢献することができます。