CloudTrailの証跡を1つのリージョンだけ出力してみた

## なんでやろうと思ったのか
AWS SOAの模擬試験内に、「CloudTrailで全てのリージョンを監査したい」要件がありました。
そこで思ったことは、全てのリージョンを監査できるなら、単一(1つ)のリージョンも監査できるのかなと…いう背景がありました。

## まずドキュメントを確認してみた
AWS Cloudtrail ユーザーガイドから引用
> 1 つのリージョンに適用される証跡
1 つのリージョンに適用される証跡を作成するときに、CloudTrail はそのリージョンでのみイベント
を記録します。次に、指定した Amazon S3 バケットに CloudTrail イベントログファイルが渡されま
す。AWS CLI を使用して、単一のリージョンの証跡のみを作成できます。追加の単一の証跡を作成
した場合、同じ Amazon S3 バケットまたは別のバケットに CloudTrail イベントログファイルを配信
する証跡を持つことができます。これは、AWS CLI または CloudTrail API を使用して証跡を作成する
ときのデフォルトのオプションです。詳細については、「AWS Command Line Interface で証跡を作
成、更新、管理する (p. 94)」を参照してください。

どうやら、CLIでしか単一リージョンを監査出力ができないようですね。

## とりあえずやってみた
### S3バケットを作る
監査ログ出力用のS3バケットが必要なので作っていきます。
(バケット名はお好きなように)

![スクリーンショット 2022-02-21 11.04.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/675ea81b-86bc-ce1a-6cc1-4730fcfa2901.png)

ちなみにバケットを作らないまま、CLIコマンドを実行すると、「バケットがない！」って怒られます。

```
aws cloudtrail create-trail --name my-trail --s3-bucket-name trail-log-backet

An error occurred (S3BucketDoesNotExistException) when calling the CreateTrail operation: S3 bucket trail-log-backet does not exist!
```

### バケットポリシーにアクセス許可を設定する
S3バケットに証跡を受け取れるバケットポリシーを追加する必要があります。
必ず必要なことは以下です。

①サービスプリンシパル要素に「cloudtrail.amazonaws.com」を使用する
②バケットに対してGetBuccketAclアクションを付与する
③PutObjectアクションを付与する

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::trail-log-backet"
        },
        {
            "Sid": "AWSCloudTrailWrite20220221",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::trail-log-backet/AWSLogs/734777192820/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceArn": "arn:aws:cloudtrail:ap-northeast-1:734777192820:trail/my-trail"
                }
            }
        }
    ]
}
```

バケットポリシーを付与しないと、CLIコマンド実行時に以下のようなエラーが発生します。

```
aws cloudtrail create-trail --name my-trail --s3-bucket-name trail-log-backet

An error occurred (InsufficientS3BucketPolicyException) when calling the CreateTrail operation: Incorrect S3 bucket policy is detected for bucket: trail-log-backet
```

## 証跡を作ってみる
CLIコマンドを実行して証跡を作成

```
aws cloudtrail create-trail --name my-trail --s3-bucket-name trail-log-backet
```

--name：証跡の名前
--s3-bucket-name：出力するS3バケットの名前

※デフォルトでは、証跡が作成されたAWSリージョンのみに記録されます。

実行結果

```
aws cloudtrail create-trail --name my-trail --s3-bucket-name trail-log-backet
{
    "Name": "my-trail",
    "S3BucketName": "trail-log-backet",
    "IncludeGlobalServiceEvents": true,
    "IsMultiRegionTrail": false,
    "TrailARN": "arn:aws:cloudtrail:ap-northeast-1:734777192820:trail/my-trail",
    "LogFileValidationEnabled": false,
    "IsOrganizationTrail": false
}
```

ここで確認することは、「IsMultiRegionTrail」がfalseになっていることで、単一のリージョンのみで監査出力されることが確認できます。

全てのリージョンで行う場合は、「--is-multi-region-trail」オプションを入れてあげてください。

## 参考資料
・[Create-trailの使用 - AWS Document](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail-by-using-the-aws-cli-create-trail.html)
・[CloudTrail の Amazon S3 バケットポリシー - AWS Document](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/create-s3-bucket-policy-for-cloudtrail.html)