AWS日記49(CloudFront - AccessLogs)

# はじめに
今回は Amazon CloudFrontの標準ログ(アクセスログ)を試します
デベロッパーガイドの[標準ログ (アクセスログ) の設定および使用](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html)を参考に、アクセスログの設定を行います
事前に作成済みのCloudFrontディストリビューションの設定変更を行い、アクセスログをS3バケットに保存します。

# 設定

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586707/ec9a0447-0f4b-ffad-7376-a5cf97515895.jpeg)

 - 事前に作成済みのCloudFrontディストリビューションの設定画面の「編集」をクリックします

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586707/c29cfdfb-21bd-8cff-2dfc-461b191eeae0.jpeg)

 - 標準ログ記録をオンにします
 - S3バケットを指定します

![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586707/c20507ea-6f93-23b0-5684-a9933bedd028.jpeg)

 - 指定したS3バケットのACLが無効の場合、エラー表示が出ます
 - 「Enable ACLs」をクリックします

![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586707/4b9e0669-368d-0919-1502-3e1ba0467955.jpeg)

 - エラー表示が消え、バケットの準備が完了します

![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586707/ca2e4d55-1a3b-9476-23ac-a3f59c285c97.jpeg)

 - 「変更を保存」をクリックします

# 追記： S3バケット用CloudFormation

```yaml
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: CloudFront AccessLogs Sample

Parameters:
  ApplicationName:
    Type: String
    Default: 'CloudFrontAccessLogsSample'

Resources:
  AccessLogsBucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: LogDeliveryWrite
      OwnershipControls:
        Rules:
          - ObjectOwnership: ObjectWriter
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: 'AES256'
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      LifecycleConfiguration:
        Rules:
          - Id: 30days
            Status: Enabled
            ExpirationInDays: 30
            NoncurrentVersionExpirationInDays: 30
    DeletionPolicy: Retain
  AccessLogsBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref AccessLogsBucket
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: SampleCloudFrontAccessLogsBucketRead
            Effect: Allow
            Principal:
              Service: cloudfront.amazonaws.com
            Action: s3:GetBucketAcl
            Resource: !Sub "arn:aws:s3:::${AccessLogsBucket}"
          - Sid: SampleCloudFrontAccessLogsBucketWrite
            Effect: Allow
            Principal:
              Service: cloudfront.amazonaws.com
            Action: s3:PutBucketAcl
            Resource: !Sub "arn:aws:s3:::${AccessLogsBucket}"

Outputs:
  BucketName:
    Description: "BucketName"
    Value: !Ref AccessLogsBucket
```

 - 前述の「ACL無効のエラー」が出ない設定です


# 確認
![07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586707/1578c87e-b566-0700-79eb-4febb5ff8bb1.jpeg)

 - 指定したS3バケットにログファイルが保存されます
 - gunzipコマンド等で解凍し、内容を確認します

アクセスログのフィールドは以下の通りです

```
date time x-edge-location sc-bytes c-ip cs-method cs(Host) cs-uri-stem sc-status cs(Referer) cs(User-Agent) cs-uri-query cs(Cookie) x-edge-result-type x-edge-request-id x-host-header cs-protocol cs-bytes time-taken x-forwarded-for ssl-protocol ssl-cipher x-edge-response-result-type cs-protocol-version fle-status fle-encrypted-fields c-port time-to-first-byte x-edge-detailed-result-type sc-content-type sc-content-len sc-range-start sc-range-end
```


# 終わりに
今回はCloudFrontの標準ログ(アクセスログ)を設定しました。
[リアルタイムログ](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/real-time-logs.html)や[エッジ関数のログ](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/edge-functions-logs.html)も取得できるため、必要に応じて試そうと思います。

### 参考ドキュメント
[標準ログ (アクセスログ) の設定および使用](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html)

[ディストリビューションを作成または更新する場合に指定する値](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesLoggingOnOff)

[CloudFrontのアクセスログ保存用S3バケットにはACL有効化が必要なので注意しよう](https://dev.classmethod.jp/articles/cloudfront-access-log-dont-choose-no-acl-s3-bucket/)