CloudFormationを使ってS3にバケットを作成してみた

## はじめに

業務でAWSに環境を作ることが多く、効率よく構築できるようCloud Formationを使って
構築を行ってみました。

##CloudFormationとは
CloudFormationとはテンプレートファイル(JSONまたはYAML)を使用してAWSリソースを自動で構築できるサービスです。
テンプレートファイルを作成していれば同様の環境を構築する際の時間を削減することができます。


## 作成する環境
今回はS3のバケットを作成するテンプレートを実行してみる

## テンプレートの作成

```storage.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: buckets for storing.
Metadata:
  'AWS::CloudFormation::Interface':
    ParameterGroups:
    - Label:
        default: 'Storage'
      Parameters:
      - BucketName
#スタック作成画面で任意で入力する項目をParametersに記載。今回はバケット名の項目のみ
Parameters:
  BucketName:
    Description: 'The name of the bucket to store the data in. If left blank, a bucket name will be generated.'
    Type: String
    Default: ''
Conditions:
  HasBucket: !Not [!Equals [!Ref BucketName, '']]
Resources:
  DataBucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: !If [HasBucket, !Ref BucketName, !Ref 'AWS::NoValue']
      AccessControl: Private
      VersioningConfiguration:
        Status: Enabled
#　　　　　　　　　ポリシーの設定も可能
      PublicAccessBlockConfiguration：
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
#    　暗号化の設定
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: 'AES256'
#     CORS設定をしたい場合は下記の様に記載
      CorsConfiguration:
        CorsRules:
          - AllowedHeaders:
              - '*'
            AllowedMethods:
              - 'GET'
              - 'PUT'
            AllowedOrigins:
              - '*'
#CloudFormationのコンソール画面の「出力」に表示させたい内容をOutpusに設定する。
Outputs:
  DataBucket:
    Description: 'Name of the bucket'
    Value: !Ref DataBucket
    Export:
      Name: !Sub '${AWS::StackName}-BucketName'

```

## 実際に動かしてみる

まずはAWSコンソールからCloudFormationへ移動し、スタックの作成を行う。
![スクリーンショット_2021-09-28_18_52_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097263/4d67811b-a89e-3946-e4e3-1b59ee777441.png)

スタック作成画面がこちら
今回はテンプレートを用意しているので、以下の項目を指定して次に進みます。
![スクリーンショット_2021-09-29_18_05_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097263/52f289ca-0dd6-d744-5195-56ebf0ceda5b.png)

次にスタック名と作成するバケットの名称の入力画面が表示されるので、入力したら次へ
![スクリーンショット 2021-09-29 18.06.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097263/19a782ce-9afb-1a13-9c8d-a447b027e166.png)

この画面でスタックのオプションや詳細な設定ができますが、今回は何もせずに次へ
![スクリーンショット 2021-09-29 18.14.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097263/829e3580-512e-7216-1d2a-78a2b5144179.png)
![スクリーンショット 2021-09-29 18.14.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097263/98e43029-0981-18ea-f959-821b35d93d71.png)

この画面でスタックの設定の最終確認を行い。問題がなければ画面下部のスタックの作成へ
![スクリーンショット_2021-09-29_18_17_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097263/ad0438ad-938a-fc4e-3953-065c04f409e6.png)

スタックが作成され、下記の様に処理が実行されるとS3に指定した名前でバケットが作成されています。
![スクリーンショット_2021-09-29_18_18_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097263/428aef78-a11d-225b-5490-b282c38d3349.png)

バケットのアクセス許可はこんな感じ
![スクリーンショット 2021-09-29 17.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097263/d63e8dd6-f853-b398-ff1f-f635f9cd893a.png)
![スクリーンショット 2021-09-29 19.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097263/6652c1e4-9eba-a3df-f8a4-65781257794a.png)


## おわりに

今回はS3のみの作成でしたが、次回以降EC2、VPC等のテンプレートも作成して記事にしたいと思います。

### 参考資料

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/quickref-s3.html