🚀

AWS CDK にコントリビュートしたときの流れ・記録

2022/09/25に公開

少し前に AWS CDK (以下のリポジトリ)にコントリビュートしたときの流れや実際に対応したことの記録です。
https://github.com/aws/aws-cdk

自分用の備忘録かつ、これから CDK にコントリビュートしたいと思っている方の参考になればよいなと思い記事にしました。

コントリビュートまでの流れ

Issue を見つける

まずは対応する Issue を決めます。
以下に Issue があがっているので、この中から対応したいものを見つけます。
https://github.com/aws/aws-cdk/issues

コントリビュートが初めての場合は good first issueeffort/small のタグがついた Issue がおすすめです。

今回対応したのは以下の Issue です。
https://github.com/aws/aws-cdk/issues/19784

Issue の内容 / 解決したい問題を整理する

上記の Issue を対応すると決めて、実際に何が問題なのか / どうやって解決・実装するのかを以下のように整理しました。

  • S3 の Lifecycle Rule では現在のバージョンでないオブジェクトを①いつ期限切れにするか②何世代までオブジェクトを保持するか を指定できる
  • 今は①しか指定できないので、②も指定できるようにする
  • 👆の対応とともに、現状のソースコードだと、非推奨の NoncurrentVersionExpirationInDays を使っているので NoncurrentVersionExpiration のプロパティを使うように変更する
// 現状のプロパティ
{
	enabled: true,
	prefix: "usr_",
	noncurrentVersionExpiration: Duration.days(1),
	expiredObjectDeleteMarker: true,
	abortIncompleteMultipartUploadAfter: Duration.days(1),
	noncurrentVersionTransitions: [
		{
			transitionAfter: Duration.days(1),
			noncurrentVersionsToRetain: 5,
			storageClass: /* Side issue: There is no s3.StorageClass.STANDARD */
		}
	]
}

// こう指定できるようにする
{
	enabled: true,
	prefix: "usr_",
	// ここを変更する
	noncurrentVersionExpiration:
		{
			expirationAfter: Duration.days(1),
			noncurrentVersionsToRetain: 5,
		},
	expiredObjectDeleteMarker: true,
	abortIncompleteMultipartUploadAfter: Duration.days(1),
	noncurrentVersionTransitions: [
		{
			transitionAfter: Duration.days(1),
			noncurrentVersionsToRetain: 5,
			storageClass: /* Side issue: There is no s3.StorageClass.STANDARD */
		}
	]
}

プルリク作成

対応内容が整理できたので、実装してプルリクを作成しました。
以下が各コミットで対応した内容です。

// Fixture with packages imported, but nothing else
import cdk = require('@aws-cdk/core');
import s3 = require('@aws-cdk/aws-s3');
import kms = require('@aws-cdk/aws-kms');
import iam = require('@aws-cdk/aws-iam');
import lambda = require('@aws-cdk/aws-lambda');
import s3n = require('@aws-cdk/aws-s3-notifications');
import sns = require('@aws-cdk/aws-sns');
import sqs = require('@aws-cdk/aws-sqs');
import assert = require('assert');

class Fixture extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string) {
    super(scope, id);

    /// here
  }
}

マージ

  • すべてのルールに沿うように実装が完了したあと、1日程度で approve されました 🎉
  • メンテナ1名に approve されるとコードベースが最新化されて CI が走ったあとに自動で merge されます

まとめ

以上が CDK にコントリビュートした際の実際の流れです(あくまで一例です)。
マージされたときは達成感がありとても嬉しかったです😄
コントリビューションガイドの読み込みが足りず後から対応した部分が多くなったのは反省点です(ドキュメントちゃんと読むの大事)。

今回の Issue 対応をするにあたり公式ドキュメントやコントリビューションガイドに加え、以下の記事を参考にさせていただきました。
https://dev.classmethod.jp/articles/aws-devday-online-japan-how-to-contribute-aws-cdk/

Discussion