CloudFormationを使ってELBのアクセスログ用のS3バケットを作成する

#はじめに
本記事では、AWS CloudFormationを使って、ELBのアクセスログ用のS3バケットを作成する手順を説明しています。（初心者向け）

本記事で掲載しているテンプレートの最新版は、下記に置いてます。
https://github.com/okubo-t/aws-cloudformation

CloudFormationを使ってELB（ALB）を構築する手順については、下記を参照してください。
[CloudFormationを使ってELBとEC2(１台)を構築する]
(https://qiita.com/okubot55/items/de7afa1e2dfe02b42e3f)
[CloudFormationを使ってELBとEC2(2台)を構築する]
(https://qiita.com/okubot55/items/46dcd0d24b1f9cc5ff49)
[CloudFormationを使ってALBとEC2(１台)を構築する]
(https://qiita.com/okubot55/items/844ae5ac5b188435d58b)
[CloudFormationを使ってALBとEC2(2台)を構築する]
(https://qiita.com/okubot55/items/21ba6f9590edba6bbb75)

#設定手順
１ AWS CloudFormation管理コンソールから、スタックの作成をクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/e0c3e7c3-f478-18c7-2dc2-7e669d1b399d.png"　 width=50%>

２ 後述のテンプレートを選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/060a4709-622a-2394-de5f-ac2103045137.png"　 width=50%>

３ 各パラメータを入力します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/ffd24377-a7d5-b172-8cae-c9924141338a.png"　 width=70%>

|パラメータ名|用途|備考|
|:---|:---|:---|
|スタックの名前|テンプレートから作成するリソース一式の名前|例　prd-stack-vpc-20180801|
|ELBLogBucketName|ELBのアクセスログを出力するS3バケットの名前||

4 後続は、デフォルトのまま次へ次へで、作成します。

５ 状況が CREATE COMPLETEになれば、ELBのアクセスログ用のS3バケットの作成が完了です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/f919b748-e62b-9f47-0eed-a3ab499405f0.png"　 width=50%>

6 EC2の管理コンソールで、ELB(ALB)のアクセスログに、CloudFormationで作成したS3バケットを設定します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/77369702-bf0e-83a9-9fad-580717517ef7.png"　 width=60%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/773f3de7-c2ae-4bf5-1cdd-edb3dbb1b787.png"　 width=60%>

#テンプレート
ELBを構築するCloudFromationのテンプレートに組み込んでも良いかと思います。

```s3-elb-accesslog.yml
AWSTemplateFormatVersion: "2010-09-09"
Description:
  S3 Bucket for ELB AccessLog Create

Metadata:
  "AWS::CloudFormation::Interface":
    ParameterGroups:
      - Label: 
          default: "S3 Bucket for ELB AccessLog Configuration"
        Parameters: 
          - ELBLogBucketName

    ParameterLabels: 
      ELBLogBucketName: 
        default: "ELBLogBucketName"

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
Parameters:
  ELBLogBucketName:
    Type: String

# ------------------------------------------------------------#
# ELBAccountId Mappings
# ------------------------------------------------------------# 
Mappings:
  ELBAccountId:
    us-east-1:
      "AccountId": "127311923021"
    us-west-2:
      "AccountId": "797873946194"
    us-west-1:
      "AccountId": "027434742980"
    eu-west-1:
      "AccountId": "156460612806"
    ap-southeast-1:
      "AccountId": "114774131450"
    ap-southeast-2:
      "AccountId": "783225319266"
    ap-northeast-1:
      "AccountId": "582318560864"
    sa-east-1:
      "AccountId": "507241528517"
    us-gov-west-1:
      "AccountId": "048591011584"

Resources:
# ------------------------------------------------------------#
#  S3
# ------------------------------------------------------------#        
# ELBLogBucket
  ELBLogBucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref ELBLogBucketName

#BucketPolicy
  ELBLogBucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref ELBLogBucket
      PolicyDocument:
        Id: "AWSCFn-AccessLogs-Policy-20180920"
        Version: "2012-10-17"
        Statement:
          - Sid: AWSCFn-20180920
            Effect: "Allow"
            Action:
              - "s3:PutObject"
            Resource: !Sub "arn:aws:s3:::${ELBLogBucket}/AWSLogs/${AWS::AccountId}/*"
            Principal:
              AWS: !FindInMap [ ELBAccountId, !Ref "AWS::Region", AccountId ]

# ------------------------------------------------------------#                
# Output Parameters
# ------------------------------------------------------------#                
Outputs:
#ELBLogBucket
  ELBLogBucket:
    Value: !Ref ELBLogBucket
    Export:
      Name: !Ref ELBLogBucketName
```