TerraformでCloudFrontを構築したときに、アクセスログ用S3バケットを作成しました。
その過程でACL関係のエラーが出たため、記事に残しておきます。
ゴール
Terraformを使用して、CloudFrontのアクセスログをS3バケットに保存するようにしたい
現在のCloudFrontとS3の定義
アクセスログ周りの設定のみ抜粋しています
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# CloudFrontを定義 resource "aws_CloudFront_distribution" "main" { ... # アクセスログの設定 logging_config { bucket = aws_s3_bucket.CloudFront_log.bucket_domain_name # Cookieをログに含めるか include_cookies = false prefix = "CloudFront/" } } # CloudFrontのアクセスログ格納用バケット resource "aws_s3_bucket" "CloudFront_log" { bucket = "bucket_name" } |
エラーの内容を確認
terraform applyしたところ、以下のエラーが出ました。
1 2 3 4 5 6 |
| Error: creating CloudFront Distribution: InvalidArgument: The S3 bucket that you specified for CloudFront logs does not enable ACL access: bucket-name.s3.amazonaws.com │ status code: 400, request id: 2d97ae7f-d295-4bb5-b8c9-72cfd857c977 │ │ with aws_CloudFront_distribution.main, │ on CloudFront.tf line 2, in resource "aws_CloudFront_distribution" "main": │ 2: resource "aws_CloudFront_distribution" "main" { |
DeepLさんに翻訳してもらうと
InvalidArgument(無効な引数)です: CloudFrontのログに指定したS3バケットがACLアクセスを有効にしていない
ということらしい。
S3バケットのACLを有効にしないといけない??
もう少し深く調べてみる
標準ログ (アクセスログ) の設定および使用 - Amazon CloudFront
ログファイルを使用してオブジェクトに対するユーザーリクエストに関する情報を取得します。
こちらのAWS ドキュメントをみても、
「2023 年 4 月以降、CloudFront 標準ログに使用される新しい S3 バケットの S3 アクセスコントロールリスト (ACL) を有効にする必要があります。」
とありますね。
ACLの種類は下記を参照ください
アクセスコントロールリスト (ACL) の概要 - Amazon Simple Storage Service
アクセスコントロールリスト (ACL) を使用して Amazon S3 のデータへのアクセスを管理する方法について説明します。
外部のユーザーがアクセスログを見る機会は今回考えないので、
private のACLを設定していきます。
ソースコード修正
Terraformのドキュメント内にprivate ACLのサンプルコードがあったので、そのまま使います
Terraform Registry
ログ格納用S3バケットを下記のように定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# CloudFrontのアクセスログ格納用バケット resource "aws_s3_bucket" "CloudFront_log" { bucket = "bucket_name" } resource "aws_s3_bucket_ownership_controls" "CloudFront_log" { bucket = aws_s3_bucket.CloudFront_log.id rule { object_ownership = "BucketOwnerPreferred" } } # ACLを設定 resource "aws_s3_bucket_acl" "CloudFront_log" { depends_on = [ aws_s3_bucket_ownership_controls.CloudFront_log ] bucket = aws_s3_bucket.CloudFront_log.id acl = "private" } |
これで無事にterraform applyが通ったので、動作確認をしていきます。
動作確認
CloudFrontのドメインにアクセスし、ログ格納用のS3バケットを確認してみると。。。
こんな感じでアクセスログが保存されていると思います。
ちなみに、ファイルの中身はこんな感じ。
1 2 3 4 |
#Version: 1.0 #Fields: 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 2023-05-31 13:30:52 NRT57-P2 618 106.72.141.98 GET d1kd24m158ozez.CloudFront.net /index.html 200 - Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/113.0.0.0%20Safari/537.36 - - Miss pggzE1uGfDC1vR-mofZufqeqrEkXAHmnmmLYNmfWziY-7mIrY0K7ow== d1kd24m158ozez.CloudFront.net https 458 0.045 - TLSv1.3 TLS_AES_128_GCM_SHA256 Miss HTTP/2.0 - - 18811 0.045 Miss text/html 273 - - 2023-05-31 13:30:52 NRT57-P2 495 106.72.141.98 GET d1kd24m158ozez.CloudFront.net /favicon.ico 403 https://d1kd24m158ozez.CloudFront.net/index.html Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/113.0.0.0%20Safari/537.36 - - Error RDpLPtfQWNG3711a5cJ8bGPlNa7q5F8RElnIa5CfC8IXja7_F5H_0w== d1kd24m158ozez.CloudFront.net https 143 0.077 - TLSv1.3 TLS_AES_128_GCM_SHA256 Error HTTP/2.0 - - 18811 0.077 Error application/xml - - - |
参考
404 | DevelopersIO
コメント