概要
AWSはそこそこ触っているものの、CloudFormation(以下CFn)を今まで使っていなかった人が
CFnを触ってみた際に引っかかった部分をざっくりとメモ
前提
- CFnのテンプレートは、YAMLを採用
- YAMLの理由は以下
- コメントの記載が可能であること
- JSONよりも記述内容がシンプルになる
引っかかった部分
CloudTrailのEventSelectorsの書き方
何がひっかかった?
AWSのドキュメントを確認しながら、CloudTrailの証跡を設定しようとした。
CloudTrailのデータイベントを設定したかったため、ドキュメントのEventSelectosの書き方を確認した。
ドキュメントが入れ子になっていて、初CFnだと書き方がパッと思い浮かばなかった。
まず、CFnでのCloudTrailの書式は、YAMLの書き方の6行目付近に記載されていた。
Type: AWS::CloudTrail::Trail
Properties:
CloudWatchLogsLogGroupArn: String
CloudWatchLogsRoleArn: String
EnableLogFileValidation: Boolean
EventSelectors:
- EventSelector
IncludeGlobalServiceEvents: Boolean
IsLogging: Boolean
IsMultiRegionTrail: Boolean
KMSKeyId: String
S3BucketName: String
S3KeyPrefix: String
SnsTopicName: String
Tags:
- Resource Tag
TrailName: String
プロパティのEventSelectorsの説明は、以下の記載になっていた。
EventSelectors
管理イベントとデータイベントのログ記録を設定します。
Required: No
型: 以下のリスト [EventSelector](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-eventselector.html)
更新に伴う要件: 中断はありません。
4行目のリンクを辿ると、書式は以下の記載になっていた。
DataResources:
- DataResource
IncludeManagementEvents: Boolean
ReadWriteType: String
プロパティのDataResourcesの記載は、以下のようになっていた。
DataResources
データイベントのリソース。CloudTrail では、Amazon S3 オブジェクトと AWS Lambda 関数のデータイベントのログ記録がサポートされています。詳細については、AWS CloudTrail User Guide の「データイベント」を参照してください。
必須: いいえ
タイプ: [DataResource](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-dataresource.html) のリスト
更新に伴う要件: 中断はありません
DataResourcesの書式は、以下のようになっていた。
Type: String
Values:
- String
どう解決した?
該当する部分については、最終的に以下のような書き方で実装した。
なお、今回はS3Bucketを全て指定する書き方としている。
EventSelectors:
- DataResources:
- Type: AWS::S3::Object
Values:
- "arn:aws:s3:::"
CloudTrailのStackを削除した後、再作成に失敗
何が引っかかった?
CloudTrailのStackを作成後、一旦問題なく作成が完了した。
作成したStackを削除し、一部定義を追加してStackを別途作成した。
すると、Stackの作成時に処理が失敗した。
どう解決した?
原因は、1度目に作成したS3Bucketが削除されていないことだった。
1度目に作成したStackには、CloudTrailのログが出力されていたため、Bucketが削除できていなかった様子。
なお、1度目に作成したStack自体は問題なく削除できていた。
仕方がないので、手動でS3Bucket内のログファイルを削除し、Bucketを削除した。
今後の対策
CFnで作成したリソースを、Stack削除時に一通り確認する。
効率のよい確認手段はないか、検討する必要がありそう。
使ったことないが、リソースグループとか活用できないか?
EventSelectorsのLambdaの書き方(全Lambdaを対象としたい)
何が引っかかった?
EventSelectorsを記載していた際に、S3は問題なく設定できたものの、Lambdaは設定ができない。
AWSのドキュメントを確認してみても、Values部分にはS3の記述しかない。
※英語でもみてみましたが、Lambdaの記述はありません。
Values
指定した Amazon S3 オブジェクトの ARN のような文字列のリスト。
ご使用の AWS アカウントで、すべての Amazon S3 バケットのすべてのオブジェクトのデータイベントをログに記録するには、arn:aws:s3::: としてプレフィックスを指定します。
Amazon S3 バケット内のすべてのオブジェクトのデータイベントをログに記録するには、バケットと空のオブジェクトプレフィックス (arn:aws:s3:::bucket-1/ など) を指定します。証跡では、この Amazon S3 バケット内のすべてのオブジェクトのデータイベントがログに記録されます。
特定のオブジェクトのデータイベントをログに記録するには、Amazon S3 バケットとオブジェクトのプレフィックス (arn:aws:s3:::bucket-1/example-images など) を指定します。証跡では、プレフィックスに一致するバケット内のすべてのオブジェクトのデータイベントがログに記録されます。
必須: いいえ
タイプ: 文字列値のリスト
更新に伴う要件: 中断はありません
どう解決した?
解決してない。
AWSサポートに問い合わせ中。
解決したら書くよ。
全体的に
テンプレートが出来てしまえば非常に楽。
意外と細かい部分で引っかかることがあるので、どうしても試行錯誤が必要となる。
十分な時間を確保して取り組む必要がある。
また、削除については漏れなく確認を行わないと、ゴミが残ることが多いのでゴミを残さない運用を考える必要がありそう。