まとまった時間が取れたので、重い腰を上げて前からやってみたかったCDKのコントリビュートにチャレンジしてみました。
備忘録的にやったことや詰まったことを等まとめておきます。
ちなみに私が初挑戦時に取り組んだのは以下です。booleanのプロパティをL2 Constructに追加するというシンプルなものです。
目次
事前学習に使用した参考資料
コントリビュートのやり方
具体的な手順は既に素晴らしい記事や資料があります。以下を参照すれば一通り流れがわかるかと思います。
また英語になりますが、以下動画でIssueから実際にPRを出すまでの流れを解説しているので非常に参考になります。
公式のコントリビュートガイドは以下です。が、英語かつ長いので最初は上記の資料をベースに流れを掴んでから読むのがおすすめです。
コントリビュートTips
やってみたいけど実際どうしたらええねん、という場合はJAWS-UG CDK支部#13のクライヤーさん、gotoさんの登壇資料が参考になります。
Issueの探し方や、実装時のTipsが解説されています。私も非常に参考にさせていただきました。
配信のアーカイブも公開されています。
またクライヤーさんがL2未対応引数をまとめたサイトも公開されています(ありがたい)。こちらも参考にすると良いかと思います。
JAWS CDK支部#13 でお話したCDK L2コンストラクトでの未対応引数について、現時点で自動取得した変数一覧をwebページで見れるようにしました。
— badmintoncryer (@nixieminton) 2024年5月2日
自分用ですが、CDKコントリビュート気になる皆様もどうぞ!
(気が向いたら日次で更新するactionsを組みます)https://t.co/M7Bc1keI4t pic.twitter.com/QXhKMfLgfH
詰まった点やTips
L1 Construct どこにあるねん → 自動で生成される
リポジトリにL1 Constructの実装が見当たらず、どこにあるのかと思っていましたがビルド時に*.generated.ts
で自動生成されます。
例えばCloudFrontの場合だとpackages/aws-cdk-lib/aws-cloudfront
配下に生成されます。
% tree . ├── README.md # 中略 │ ├── cloudfront.generated.ts # 以下略
Heap 不足 → NODE_OPTIONS
を設定
Heapが枯渇してPCが固まったり、VSCodeが落ちることが多々ありました(M2 Macbook AIr 16GBを使用)。
そのため以下のように上限を設定するようにしています。
% export NODE_OPTIONS=--max-old-space-size=8192
ビルドに時間がかかる → yarn watch
で差分ビルド
ビルドを行う場合は以下で実施します。
# aws-cdk-libとinteg testsをビルド。 --skip-nx-cacheでキャッシュをスキップ % npx lerna run build --scope=aws-cdk-lib --scope=@aws-cdk-testing/framework-integ --skip-nx-cache # αモジュールの場合は個別にビルド(例はivs) % npx lerna run build --scope=@aws-cdk/aws-ivs-alpha
しかしそれなりに時間がかかるので、毎回やってると大変です。そのため一度ビルドした後はyarn watch
で差分ビルドを行いつつ実装するのが良いです。
以下はaws-cdk-lib
を差分ビルドする際の例。
# 対象のディレクトリに移動 % cd packages/aws-cdk-lib # 差分ビルド % yarn watch
上記実行後に- Starting compilation in watch mode...
が表示されれば、以降ファイル保存後に差分ビルドが行われます。
GitHub Actions の cli-changes
で Error: Not Found
→ 最新の main を merge で解決
PR作成後にCIでチェックが走りますが、その中のcli-changes
におけるFind changed cli files
でError: Not Found
が発生することがありました。
原因はよくわかっていないですが、最新のmainの内容を取り込むことで解決しました。PR上から行う場合はUpdate Branch
から実施できます。
※原因わからず途方に暮れてたところ、クライヤーさんに助けていただきました。ありがとうございました 🙇
cloudfrontのPRですよね..??アンラッキーなだけな気もするので、一度最新のmainを反映してみて再実行頂くと良いかもです。
— badmintoncryer (@nixieminton) 2024年5月1日
(たまに理由なく落ちることがある気がします)
Fork 元の aws-cdk の変更を取り込むには
以下コマンドで可能です。
% git remote add upstream git@github.com:aws/aws-cdk.git % git remote -v origin https://github.com/mazyu36/aws-cdk.git (fetch) origin https://github.com/mazyu36/aws-cdk.git (push) upstream git@github.com:aws/aws-cdk.git (fetch) upstream git@github.com:aws/aws-cdk.git (push) % git fetch upstream % git merge upstream/main
以下参考にさせていただきました。 zenn.dev
integ test でよく使うオプション
コントリビュート時はinteg testを実装して実行します。
% yarn integ test/aws-cloudfront/test/integ.distribution-function-autopublish.js --update-on-failed --no-clean --force
以下のオプションをよく使っています。
--update-on-failed
: snapshot test失敗時もinteg testを実行します--no-clean
: integ test実行後のスタック削除を抑止できます。integ testのリソースデプロイ後にマネコン上で設定値を確認したい時に便利です。!!!リソースの消し忘れにはご注意ください!!!--force
: snapshot test成功時もinteg testを強制的に実行します。
オプションの全量は以下のドキュメントをご参照ください。
※integ testは以下の記事でも解説しています。 mazyu36.hatenablog.com
integ testでAssertionを行う
integ testにおいて設定値の確認のテストを実装することがありました(以下のPR)。
以下のようにawsApiCallを使用して、設定値のAssertionを行うことが可能です。
test.assertions.awsApiCall('SESV2', 'GetAccount') .expect(integ.ExpectedResult.objectLike({ VdmAttributes: { DashboardAttributes: { EngagementMetrics: 'ENABLED', }, GuardianAttributes: { OptimizedSharedDelivery: 'ENABLED', }, VdmEnabled: 'ENABLED', }, }));
おわりに
OSSコントリビュート自体初でしたが、そこまで詰まることなく実施できました。
実装自体もそんなに難しくないので、CDKを多少使用したことがあれば十分実施できると思います。
興味を持たれた方はぜひチャレンジしてみてください。