はじめに
GuardDutyの信頼されているIPリストはいくつかのフォーマットのファイルで設定することができますが、
基本的にS3バケットにアップロードする必要があります。
CDKには、信頼されているIPリストを設定できる CfnIPSet が用意されています。
CDKでGuardDutyの信頼されているIPリスト を設定するならS3のファイルデプロイまでCDKで行いたいと思いました。
話さないこと
- Amazon GuardDutyについて
- AWS CDKの基本的なことについて
環境
CDK 2.86.0(TypeScript)
BucketDeployment
CDKでS3のファイルをデプロイするには、公式で aws_s3_deployment というモジュールが用意されています。
これを使って任意のバケットにファイルをアップロードすることが可能です。
const whiteListIpBucket = new Bucket(this, 'WhitelistIpBucket', {});
const deployment = new BucketDeployment(this, 'WhitelistIp', {
sources: [Source.asset(path.join(__dirname, './config/guardduty'))],
destinationBucket: whiteListIpBucket
});
CfnIPSet
上記のリファレンスにも記載されていますが、以下のような記述になります。
const ipSet = new CfnIPSet(this, 'IpSet', {
activate: true,
detectorId: detectorId,
format: 'TXT',
location: `s3://${whiteListIpBucket.bucketName}/whitelistip.txt`,
});
エラー
上記の設定だけでは、Cloudformationが依存関係を正しく処理できないような挙動になり、エラーとなります。
Cloudformationのスタックを見ていると、 deployment
が完了する前に ipSet
を実行しようとしています。
このような場合は addDependency を使うと思います。
しかし、以下のように書くとエラーとなります。
ipSet.addDependency(deployment);
型 'BucketDeployment' の引数を型 'CfnResource' のパラメーターに割り当てることはできません。
型 'BucketDeployment' には 型 'CfnResource' からの次のプロパティがありません: cfnOptions, cfnResourceType, _cfnProperties,,,
これは、 addDependency
の引数は CfnResource
である必要がありますが、 BucketDeployment
はそうではないためです(Cloudformationのカスタムリソースが作られます)
対応
aws_s3_deployment を眺めていたら、以下のような説明がありました
If sequenced access to the original destination bucket is required, you may add a dependency on the bucket deployment instead: otherResource.node.addDependency(deployment)
上記の説明から、以下のような書き方になります。
ipSet.node.addDependency(deployment);
このようにすると、 BucketDeployment
-> CfnIPSet
と依存関係を指定することができ、正しくデプロイすることができます。
おわりに
CDKはプログラミングの知識が浅くても抽象的に書けることがメリットですが、言語仕様など、定期的に壁に当たっています。
深く学習する機会をちゃんと作りたいと思いました。
コードは ksaga9/cdk-sample にアップロードしています。参考にどうぞ。