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 ディレクトリ以下のコードのようです。

img_1.png

コードの仕組み自体は細かく触れませんが、私が実施したプルリクを参考にしてください。

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 すれば起動するものをおさえることができます。

img_1.png

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はかなりのモジュールが多いので必要なもののみに抑えるのがおすすめです。 とはいえ、特定のプラグインだけバージョンが違うことは認められていないようです。 なので、編集したものとあわせ、実際に環境で使用するプラグインも指定します。 この例では、ecsec2elbv2をビルド。

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

あとは動作を確認したり、アップストリームに貢献することができます。