Cloud Formationで簡単に全リージョンのCloudTrailを有効化する

サクっとできるので、アカウント作ったらとりあえずやっておくといいかもしれません:grinning:

以下は、**全リージョンのCloudTrailを有効にするCloudFormationテンプレート**のペライチと、使い方になります。

テンプレートは、公式ドキュメントをベースに以下の修正を加えています。

- **全てのリージョンで CloudTrail 証跡を有効**にするように変更
- **グローバルサービス (IAM など) からのイベントをログファイルに発行**するように変更
- Outputに**SNS TopicのARNと、S3バケット名を出力**するように変更
- SNSのサブスクリプションは指定しない → サブスクリプションは後から自由に設定したいので、SNS Topicだけ作っておく

# CloudFormation テンプレート

```yaml
---
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  S3Bucket:
    DeletionPolicy: Retain
    Type: "AWS::S3::Bucket"
    Properties: {}
  BucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket:
        Ref: S3Bucket
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Sid: "AWSCloudTrailAclCheck"
            Effect: "Allow"
            Principal:
              Service: "cloudtrail.amazonaws.com"
            Action: "s3:GetBucketAcl"
            Resource:
              !Sub |-
                arn:aws:s3:::${S3Bucket}
          -
            Sid: "AWSCloudTrailWrite"
            Effect: "Allow"
            Principal:
              Service: "cloudtrail.amazonaws.com"
            Action: "s3:PutObject"
            Resource:
              !Sub |-
                arn:aws:s3:::${S3Bucket}/AWSLogs/${AWS::AccountId}/*
            Condition:
              StringEquals:
                s3:x-amz-acl: "bucket-owner-full-control"
  Topic:
    Type: "AWS::SNS::Topic"
  TopicPolicy:
    Type: "AWS::SNS::TopicPolicy"
    Properties:
      Topics:
        - Ref: "Topic"
      PolicyDocument:
        Version: "2008-10-17"
        Statement:
          -
            Sid: "AWSCloudTrailSNSPolicy"
            Effect: "Allow"
            Principal:
              Service: "cloudtrail.amazonaws.com"
            Resource: "*"
            Action: "SNS:Publish"
  myTrail:
    DependsOn:
        - BucketPolicy
        - TopicPolicy
    Type: "AWS::CloudTrail::Trail"
    Properties:
      S3BucketName:
        Ref: S3Bucket
      SnsTopicName:
        !GetAtt Topic.TopicName
      IsLogging: true
      IsMultiRegionTrail: true
      IncludeGlobalServiceEvents: true
Outputs:
  SNSTopicArn:
    Value: !Ref Topic
  S3BucketName:
    Value: !Ref S3Bucket
```

# 使い方
どんなリソースが作られるのか視覚的にわかりやすいので、**CloudFormation Designer**を使ってテンプレートを読み込んでみます。（慣れている方は、aws cliとかを使ってもいいと思います）

まずは、CloudFormationのコンソールを開いて、「テンプレートのデザイン」を押します。

<img width="624" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/685ea07d-51a6-8f11-c9ac-c8bb2abb80f5.png">

CloudFormation Designerの画面が開いたら、

1. テンプレートの言語の選択をYAMLに変えます
2. テンプレートタブに上記テンプレをコピペします
3. テンプレをvalidateします
4. 画面右上の矢印から画面のリフレッシュを行います

<img width="1007" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/c3362639-58a0-c230-bf01-bb3a08e24011.png">

すると、リソースがどのようにつくられるか可視化されます:clap:

あとは、画面上部左上にある:cloud:のアイコンからスタックを作成する画面に行って、適当に名前をつけて作成します。

<img width="970" alt="スクリーンショット 2017-06-20 13.34.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/1a6781fb-c49b-68d2-d900-8fea95e0c5eb.png">

簡単。うまくいくと状況がCREATE_COMPLETEになります。

<img width="991" alt="スクリーンショット 2017-06-20 13.41.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/69899da9-5334-6f04-9284-f04d11044acc.png">

# まとめ
正直CloudTrailのコンソールからでもポチポチやれば簡単に設定できるのですが、なるべくリソース作成や変更はコード化しておくと、後からいろいろ見直しやすいのでおすすめです:thumbsup:

# 参考
http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html