Amazon Cloud Trailを有効化するCloud Formation Template

AWSアカウントを作成する際、プロダクション環境であればCloudTrailを必ず有効にすると思います。

その際、ミスが無いように確認しながらManagement ConsoleやCLIで作業するのは面倒だなーとので、 CloudFormatonのテンプレートを作成しました。 (刺身タンポポ撲滅したい)

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "CloudTrail",
  "Resources": {
    "S3Bucket": {
      "DeletionPolicy" : "Retain",
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName" : { "Fn::Join" : ["", [ "cloudtrail-", {"Ref":"AWS::AccountId"}, "-", {"Ref":"AWS::Region"} ] ] }
      }
    },
    "BucketPolicy" : {
      "Type" : "AWS::S3::BucketPolicy",
      "Properties" : {
        "Bucket" : {"Ref" : "S3Bucket"},
        "PolicyDocument" : {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "AWSCloudTrailAclCheck",
              "Effect": "Allow",
              "Principal": {
                "AWS": [
                  "arn:aws:iam::903692715234:root",
                  "arn:aws:iam::859597730677:root",
                  "arn:aws:iam::814480443879:root",
                  "arn:aws:iam::216624486486:root",
                  "arn:aws:iam::086441151436:root",
                  "arn:aws:iam::388731089494:root",
                  "arn:aws:iam::284668455005:root",
                  "arn:aws:iam::113285607260:root",
                  "arn:aws:iam::035351147821:root"
                ]
              },
              "Action": "s3:GetBucketAcl",
              "Resource": { "Fn::Join" : ["", ["arn:aws:s3:::", {"Ref":"S3Bucket"}]]}
            },
            {
              "Sid": "AWSCloudTrailWrite",
              "Effect": "Allow",
              "Principal": {
                "AWS": [
                  "arn:aws:iam::903692715234:root",
                  "arn:aws:iam::859597730677:root",
                  "arn:aws:iam::814480443879:root",
                  "arn:aws:iam::216624486486:root",
                  "arn:aws:iam::086441151436:root",
                  "arn:aws:iam::388731089494:root",
                  "arn:aws:iam::284668455005:root",
                  "arn:aws:iam::113285607260:root",
                  "arn:aws:iam::035351147821:root"
                ]
              },
              "Action": "s3:PutObject",
              "Resource": { "Fn::Join" : ["", ["arn:aws:s3:::", {"Ref":"S3Bucket"}, "/AWSLogs/", {"Ref":"AWS::AccountId"}, "/*"]]},
              "Condition": {
                "StringEquals": {
                  "s3:x-amz-acl": "bucket-owner-full-control"
                }
              }
            }
          ]
        }
      }
    },
    "myTrail" : {
      "DependsOn" : ["BucketPolicy"],
      "Type" : "AWS::CloudTrail::Trail",
      "Properties" : {
        "IncludeGlobalServiceEvents" : true ,
        "S3BucketName" : {"Ref":"S3Bucket"},
        "IsLogging" : true
      }
    }
  }
}

S3のバケット名は、「cloudtrail-(AWS ID 12桁)-(リージョン名)」という感じで、AWSアカウントのIDとCloudFormationを実行しているリージョンの名前が自動的に設定されます。

AWSアカウントのIDとリージョンの名前の設定には議事パラメータを、バケット名の連結には組み込み関数を利用しています。

Intrinsic Function Reference - AWS CloudFormation

Pseudo Parameters Reference - AWS CloudFormation

そのため、他のリージョンおよび今後作成するAWSアカウントでも再利用できます。 (バケット名は基本的に一意になると思いますが、保証できるわけではありません。)

Cloud Trailの有効化自体は簡単にできますが、命名規則に則っているか、といった細かい確認が不要になるので心理的には楽かなーと思います。(個人の見解)