mazyu36の日記

某SIer所属のクラウドエンジニアのブログ

CDKのコントリビュートデビューしたのでやったことや詰まったこと等をまとめる

まとまった時間が取れたので、重い腰を上げて前からやってみたかったCDKのコントリビュートにチャレンジしてみました。

備忘録的にやったことや詰まったことを等まとめておきます。

ちなみに私が初挑戦時に取り組んだのは以下です。booleanのプロパティをL2 Constructに追加するというシンプルなものです。

github.com

目次

事前学習に使用した参考資料

コントリビュートのやり方

具体的な手順は既に素晴らしい記事や資料があります。以下を参照すれば一通り流れがわかるかと思います。

zenn.dev

speakerdeck.com

また英語になりますが、以下動画でIssueから実際にPRを出すまでの流れを解説しているので非常に参考になります。

www.youtube.com

www.youtube.com

公式のコントリビュートガイドは以下です。が、英語かつ長いので最初は上記の資料をベースに流れを掴んでから読むのがおすすめです。

github.com

コントリビュートTips

やってみたいけど実際どうしたらええねん、という場合はJAWS-UG CDK支部#13のクライヤーさん、gotoさんの登壇資料が参考になります。

Issueの探し方や、実装時のTipsが解説されています。私も非常に参考にさせていただきました。

speakerdeck.com

speakerdeck.com

配信のアーカイブも公開されています。

www.youtube.com

またクライヤーさんがL2未対応引数をまとめたサイトも公開されています(ありがたい)。こちらも参考にすると良いかと思います。

詰まった点や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-changesError: Not Found → 最新の main を merge で解決

PR作成後にCIでチェックが走りますが、その中のcli-changesにおけるFind changed cli filesError: Not Foundが発生することがありました。

原因はよくわかっていないですが、最新のmainの内容を取り込むことで解決しました。PR上から行う場合はUpdate Branchから実施できます。

※原因わからず途方に暮れてたところ、クライヤーさんに助けていただきました。ありがとうございました 🙇

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を強制的に実行します。

オプションの全量は以下のドキュメントをご参照ください。

github.com

※integ testは以下の記事でも解説しています。 mazyu36.hatenablog.com

integ testでAssertionを行う

integ testにおいて設定値の確認のテストを実装することがありました(以下のPR)。

github.com

以下のようにawsApiCallを使用して、設定値のAssertionを行うことが可能です。

test.assertions.awsApiCall('SESV2', 'GetAccount')
  .expect(integ.ExpectedResult.objectLike({
    VdmAttributes: {
      DashboardAttributes: {
        EngagementMetrics: 'ENABLED',
      },
      GuardianAttributes: {
        OptimizedSharedDelivery: 'ENABLED',
      },
      VdmEnabled: 'ENABLED',
    },
  }));

おわりに

OSSコントリビュート自体初でしたが、そこまで詰まることなく実施できました。

実装自体もそんなに難しくないので、CDKを多少使用したことがあれば十分実施できると思います。

興味を持たれた方はぜひチャレンジしてみてください。