CloudFormationを使ってS3バケットを構築し、ライフサイクルルールを設定する

今回はCloudFormaitonを使ってS3バケットを構築し、ライフサイクルルールを設定する手順を説明します。

#前提条件
- Windows10を使用。
- PCはDELLを使用。
- ファイルの拡張子は.ymlを使用。
- 東京リージョンを使用。

#料金
テンプレート自体に料金は発生しないが、作成後のAWSリソースに関しては料金が発生しますのでご注意下さい。

#事前準備
- AWSアカウントを所持していること。
- Amazon S3へのアクセス権限（書き込み・読み取り）を許可していること。
- AWS Cloudformationへのアクセス権限（書き込み・読み取り）を許可していること。

#構築内容
- 東京リージョンにS3バケットを構築。
- バージョニングを有効にする。
- 暗号化方式はSSE-S3を使用し、AES-256を使用。
- 作成したS3バケットに対して読み取り専用を許可
- ライフサイクルルールは以下のように設定する<br>
**1. バージョニングされたデータをデフォルトで30日後にS3 Glacierへ移行**<br>
**2. バージョニングされたデータをデフォルトで365日後に削除**<br>

#テンプレート
S3バケットの作成のスタックは以下の通りです。

```yml:S3_create.yml
AWSTemplateFormatVersion: "2010-09-09"
Description:
  Cloudformation S3-bucket

#各種メタデータ一覧
Metadata:
  "AWS::CloudFormation::Interface":
    ParameterGroups:
      - Label:
          default: "Project Name Prefix"
        Parameters:
          - PJPrefix
      - Label:
          default: "S3 Configuration"
        Parameters:
          - TransitionInDays
          - NoncurrentVersionExpirationInDays
    
    ParameterLabels:
      TransitionInDays:
        default: "TransitionInDays"
      NoncurrentVersionExpirationInDays:
        default: "NoncurrentVersionExpirationInDays"

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
Parameters:

# PJPrefixを3文字以上63文字以内に設定し、デフォルト値をs3bucketとする
  PJPrefix:
    Type: String
    Default: "s3bucket"
    MinLength: 3
    MaxLength: 63
    AllowedPattern: "[a-z][a-z0-9]*"
    ConstraintDescription: "must begin with a letter and contain only alphanumeric characters." 

# バージョニングされているデータをデフォルトで30日後にS3 Glacierへ移行。
  TransitionInDays: 
    Type: String
    Default: 30

# バージョニングされているデータをデフォルトで365日後に削除。
  NoncurrentVersionExpirationInDays:
    Type: String
    Default: 365

Resources: 
# ------------------------------------------------------------#
#  S3 Bucket
# ------------------------------------------------------------#
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: !Ref PJPrefix
      VersioningConfiguration: 
        Status: Enabled
      BucketEncryption: 
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256

      LifecycleConfiguration:
        Rules:
          - Id  : !Ref PJPrefix
            Status: Enabled
            Prefix: log/
            NoncurrentVersionTransition:
              StorageClass: GLACIER
              TransitionInDays: !Ref TransitionInDays
            NoncurrentVersionExpirationInDays: !Ref NoncurrentVersionExpirationInDays
            
# 作成したS3バケットに対して読み取り専用を許可
  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3Bucket
      PolicyDocument:
        Statement:
          - Action:
              - s3:GetObject
            Effect: "Allow"
            Principal: "*"
            Resource: !Sub arn:aws:s3:::${S3Bucket}/*
```

#スタック作成後の動作確認

１、S3コンソールにアクセスしバケットの項目をクリック後、テンプレートで指定したS3バケットが作成されていることを確認する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/13224a2f-64d5-d810-99ad-348859f81116.png)

２、作成したS3バケットをクリックしプロパティの項目へ移動後、バージョニングが有効になっていることを確認する。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/4f651abe-9005-f357-7232-64f0867e45ee.png)

３、さらに下にスクロールしデフォルトの暗号化が有効化で且つサーバー側の暗号化がSSE-3であることを確認する。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/2803b620-b13f-658f-4740-f18094b303b6.png)

４、アクセス許可の項目へ移動しバケットポリシーが読み取り専用を許可していることを確認する。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/f13469a3-10d8-a91c-135d-52828e572e11.png)

５、管理の項目へ移動し作成したライフサイクルルールをクリックする。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/4a2132b4-b1b3-995c-6e8c-41cbccd382ba.png)

６、削除とS3 Glacierの設定がテンプレートで定義した値であることを確認する。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/232fc3c8-cbe3-ee3d-92c8-7a75e8d96797.png)

#終わりに
CloudFormaitonを使ってS3バケットを構築し、ライフサイクルルールを設定する手順を説明しました。
他のAWSリソースでコード化が実現出来たら随時Qiitaに投稿します♪