CloudFormation初心者の初歩的なメモ（CloudTrailを作成したとき）

# 概要

AWSはそこそこ触っているものの、CloudFormation（以下CFn）を今まで使っていなかった人が
CFnを触ってみた際に引っかかった部分をざっくりとメモ

# 前提

- CFnのテンプレートは、YAMLを採用
  - YAMLの理由は以下
    - コメントの記載が可能であること
    - JSONよりも記述内容がシンプルになる

# 引っかかった部分

## CloudTrailのEventSelectorsの書き方

### 何がひっかかった？

AWSの[ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html)を確認しながら、CloudTrailの証跡を設定しようとした。
CloudTrailのデータイベントを設定したかったため、ドキュメントのEventSelectosの書き方を確認した。
ドキュメントが入れ子になっていて、初CFnだと書き方がパッと思い浮かばなかった。

まず、CFnでのCloudTrailの書式は、YAMLの書き方の６行目付近に記載されていた。

```
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)
    更新に伴う要件: 中断はありません。
```

４行目のリンクを辿ると、書式は以下の記載になっていた。

```
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の[ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-dataresource.html)を確認してみても、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サポートに問い合わせ中。
解決したら書くよ。

# 全体的に

テンプレートが出来てしまえば非常に楽。
意外と細かい部分で引っかかることがあるので、どうしても試行錯誤が必要となる。
十分な時間を確保して取り組む必要がある。

また、削除については漏れなく確認を行わないと、ゴミが残ることが多いのでゴミを残さない運用を考える必要がありそう。