Hugo + CloudFront + S3 + GitHub Actions でCI/CD付きブログサイトを構築してみる Part2-3 作成するリソースの確認 CloudFrontログ保存用s3


## 作成経緯
https://qiita.com/Tanamachi_kaoru/items/ade2c4822817d3d80d87

https://qiita.com/Tanamachi_kaoru/items/0686b3a451a5d86d9196

https://qiita.com/Tanamachi_kaoru/items/550607045cf0f3474dd1

この続き。
参考サイトからcloudformationで作成している部分の要素をterraformに落とし込むため、確認を行う。
今回はCFログ保存用のs3を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/b017d04e-b7b4-c304-eef1-6d3a7cd9d9f1.png)
この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**


# CloudFrontログ保存用s3
[参考サイト](https://dev.classmethod.jp/articles/cloudfront-and-s3-using-hugo-with-github-actions/)のCloudformationでは以下のような記載になっている。
今回もひと要素づつ分解して見ていく。
(静的サイト用のs3と同じ部分もあるようなので同じ部分はスキップ。差分だけ見ます)
<details>
<summary>S3バケット CloudFrontのログ保存</summary>

```
   # CloudFront log bucket
  S3BucketLogs:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    Properties:
      BucketName: !Sub ${ProjectName}-${Environment}-${S3BucketName}-cloudfrontlogs-${AWS::AccountId}
      OwnershipControls:
        Rules:
          - ObjectOwnership: "ObjectWriter"
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
      VersioningConfiguration:
        Status: Enabled
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: "AES256"
            BucketKeyEnabled: false
      LifecycleConfiguration:
        Rules:
          - Id: AbortIncompleteMultipartUpload
            AbortIncompleteMultipartUpload:
              DaysAfterInitiation: 7
            Status: "Enabled"
          - Id: CurrentVersionExpiration
            ExpirationInDays: 180
            Status: "Enabled"
          - Id: NoncurrentVersionExpiration
            NoncurrentVersionExpiration:
              NoncurrentDays: 30
            Status: "Enabled"
```

</details>

## DeletionPolicy
s3というよりかはcloudformation特有の要素のようです。
基本的にcloudformationを利用するとスタックが作成され、それとリソースが関連付けられており、
スタックが削除されるとそれに含まれるリソースも削除されます。
しかし、この要素で`Retain`を指定しておくと、スタックは削除されるがそのリソースは削除されずに残るようです。
`Delete`だとスタックが削除されるとリソースも一緒に消えます。
指定がなかった場合
>DeletionPolicy 属性が設定されていない場合、AWS CloudFormation ではデフォルトでリソースが削除されます。

の動作を取るようです。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html

## UpdateReplacePolicy
こちらもはcloudformation特有の要素のようです。
cloudformationでスタックに対する変更を行うとリソースは新しいリソースを置換するように動きます。
置換後に古いリソースを削除するかどうかの要素です。
この要素で`Retain`を指定しておくと、スタック内のリソースは置換後リソースは削除されずに残るようです。
指定がなかった場合は
>UpdateReplacePolicy を指定しない場合、CloudFormation はリソースを削除します。ただし、次の点を考慮する必要があります。
Amazon S3 バケットでは、削除を成功させるためにはバケットのすべてのオブジェクトを削除する必要があります。

の動作を取るようです。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html

## LifecycleConfiguration
値がログ保存用ということで長めに取られているようです。
それ以外の差分は特にないのでここでは記載しません。

# ハマったところとか
なぜcloudforntログ格納のバケットにだけDeletionPolicyが設定されているのが参考サイト上でも記載がなかったので不明でした。
ざっくりとリソースについて確認してきましたが一つのファイルに全部書かれると読みにくいですね……。

# 次にやること
- 必要なAWSのリソースをterraformで作成
- HUGOでHPをいい感じに編集する
- GitHub Actionsの設定

次はいよいよterraformの作成です。