ベストプラクティス
L1 コンストラクト
-
L1 コンストラクトを直接使用することを常に避けることはできないものの、可能な限り避けるようにすべきです。特定の L2 コンストラクトがエッジケースに対応していない場合は、L1 コンストラクトを直接使用する代わりに、以下の 2 つの選択肢を検討すると良いでしょう。
-
defaultChildにアクセスする: 必要な CloudFormation プロパティが L2 コンストラクトで利用できない場合は、L2Construct.node.defaultChildを使用して、基盤となる L1 コンストラクトにアクセスできます。このプロパティを介してアクセスすると、L1 コンストラクトの public プロパティを更新可能なため、L1 コンストラクトを手動で作成しなくても済みます。 -
プロパティオーバーライドを使用する: 更新対象のプロパティが public でない場合の対処を考えてみましょう。CloudFormation テンプレートで実行可能な操作を、AWS CDK でも実行できるようにする究極の方法は、addPropertyOverride を使用することです。このメソッドは、すべての L1 コンストラクトで利用できます。このメソッドに CloudFormation プロパティの名前と値を直接渡すと、CloudFormation テンプレートレベルでスタック操作が可能になります。
-
L2 コンストラクト
-
ここで重要なのは、多くの場合 L2 コンストラクトに用意されているヘルパーメソッドの活用です。レイヤー 2 では、インスタンス化時にすべてのプロパティを渡す必要はありません。L2 ヘルパーメソッドを使用すると、リソースのプロビジョニングが飛躍的に容易になります。特に、条件付きロジックが必要な場合にそれが顕著です。Grant クラスから派生したヘルパーメソッドは、最も便利なヘルパーメソッドの 1 つと言えるでしょう。このクラスは、直接使用するものではありませんが、多くの L2 コンストラクトでは、このクラスを使用して、権限の実装を大幅に簡素化するヘルパーメソッドが提供されています。例えば、L2 Lambda 関数に L2 S3 バケットへのアクセス権限を付与する場合、
s3Bucket.grantReadWrite(lambdaFunction)を呼び出すことができるため、新しいロールやポリシーを作成しなくても済みます。
L3 コンストラクト
-
L3 コンストラクトは、スタックの再利用性とやカスタマイズ性を高めるときに非常に便利なものですが、慎重に使用することをお勧めします。どのような L3 コンストラクトのタイプが必要かや、そもそも L3 コンストラクトが必要かどうかを検討してください。
-
AWS リソースと直接やり取りしない場合は、一般的に、
Constructクラスを継承するよりもヘルパークラスを作成する方が適切です。なぜなら、Constructクラスがデフォルトで実行するアクションの多くは、AWS リソースと直接やり取りする場合にのみ必要となるからです。こうしたアクションの実行が不要な場合は、それらを実行しない方が効率的です。 -
L3 コンストラクトの新規作成が適切と判断したら、
Constructクラスを直接継承してください。他の L2 コンストラクトの継承は、そのコンストラクトのデフォルトプロパティを更新する場合にのみ行います。他の L2 コンストラクトやカスタムロジックが必要な場合は、Constructを直接継承し、そのコンストラクタ内ですべてのリソースをインスタンス化します。
-