スキップしてコンテンツを表示

あるアカウント内の CloudFront ログを別のアカウント内の Amazon S3 バケットに送信する方法を教えてください。

所要時間2分
0

ある AWS アカウント内のログを、別のアカウント内の Amazon Simple Storage Service (Amazon S3) バケットに Amazon CloudFront ディストリビューションを使用して送信したいのですが、クロスアカウントログ記録の送信先を設定しようとした際、Access Denied (403) エラーメッセージが表示されます。

簡単な説明

"Access Denied" エラーを解決し、クロスアカウントログ記録を正しく設定するには、S3 バケットにログを書き込むアクセス許可を CloudFront に付与する必要があります。

重要: 同じアカウントで S3 バケットを使用する場合は、クロスアカウントログ記録を設定する必要はありません。CloudFront は、必要な S3 バケットポリシーを自動的に作成します。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

次の解決策において、アカウント A は CloudFront ディストリビューションが配置されているアカウントを示します。アカウント B は S3 バケットが配置されている送信先アカウントを示します。

クロスアカウントログ記録を設定し、S3 バケットにログを書き込むアクセス許可を CloudFront に付与するには、次の手順を実行します。

  1. アカウント A で標準ログ記録 (v2) を設定します。
    注: 標準ログを有効にするには、プロプランまたは従量制料金プランを使用する必要があります。詳細については、「Amazon CloudFront の料金」を参照してください。
  2. アカウント A で次の AWS CLI コマンド put-delivery-source を実行し、CloudFront ディストリビューションで配信ソースを作成します。
    aws logs put-delivery-source \
    --name DELIVERY_SOURCE_NAME \
    --resource-arn arn:aws:cloudfront::SOURCE_ACCOUNT_ID:distribution/DISTRIBUTION_ID \
    --log-type ACCESS_LOGS \
    --region us-east-1
    注: DELIVERY_SOURCE_NAMESOURCE_ACCOUNT_IDDISTRIBUTION_IDACCESS_LOGS をそれぞれ実際の値に置き換えてください。
  3. アカウント B で次のバケットポリシーを S3 バケットに追加し、delivery.logs.amazonaws.com サービスプリンシパルがログをアップロードできるようにします。
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AWSLogsDeliveryWrite",
                "Effect": "Allow",
                "Principal": {
                    "Service": "delivery.logs.amazonaws.com"
                },
                "Action": "s3:PutObject",
                "Resource": "arn:aws:s3:::BUCKET_NAME/PREFIX/*",
                "Condition": {
                    "StringEquals": {
                        "aws:SourceAccount": "SOURCE_ACCOUNT_ID",
                        "s3:x-amz-acl": "bucket-owner-full-control"
                    },
                    "ArnLike": {
                        "aws:SourceArn": "arn:aws:logs:us-east-1:SOURCE_ACCOUNT_ID:delivery-source:DELIVERY_SOURCE_NAME"
                    }
                }
            }
        ]
    }
    注: BUCKET_NAMEPREFIXSOURCE_ACCOUNT_IDDELIVERY_SOURCE_NAME をそれぞれ実際の値に置き換えてください。
  4. アカウント B で次の put-delivery-destination コマンドを実行し、配信の送信先を作成します。
    aws logs put-delivery-destination \
    --name DELIVERY_DESTINATION_NAME \
    --delivery-destination-configuration destinationResourceArn=arn:aws:s3:::BUCKET_NAME/PREFIX \
    --region us-east-1
    注: DELIVERY_DESTINATION_NAMEBUCKET_NAMEPREFIX をそれぞれ実際の値に置き換えてください。アカウント B は、新しい配信先に配信先ポリシーを作成します。このポリシーは、アカウント A にログ配信を作成するアクセス許可を付与します。
  5. 任意の JSON エディタを使用して、次の送信先ポリシーを作成します。
    {
        "Version": "2012-10-17",
        "Statement": [{
            "Sid": "AllowCreateDelivery",
            "Effect": "Allow",
            "Principal": {
                "AWS": "SOURCE_ACCOUNT_ID"
            },
            "Action": [
                "logs:CreateDelivery"
            ],
            "Resource": "arn:aws:logs:us-east-1:DESTINATION_ACCOUNT_ID:delivery-destination:DELIVERY_DESTINATION_NAME"
        }]
    }
    注: SOURCE_ACCOUNT_IDDESTINATION_ACCOUNT_IDDELIVERY_DESTINATION_NAME をそれぞれ実際の値に置き換えてください。
  6. ポリシーに destination-policy-s3.json という名前を付け、ローカルマシンにファイルを保存します。
  7. アカウント B で次の put-delivery-destination-policy コマンドを実行し、配信先に destination-policy-s3.json ポリシーを追加します。
    aws logs put-delivery-destination-policy \
    --delivery-destination-name DELIVERY_DESTINATION_NAME  \
    --delivery-destination-policy file://destination-policy-s3.json \
    --region us-east-1
    注: DELIVERY_DESTINATION_NAME を実際の値に置き換えてください。
  8. アカウント A で次の create-delivery コマンドを実行し、アカウント A 内の配信ソースをアカウント B の配信先に接続します。
    aws logs create-delivery \
    --delivery-source-name S3-delivery \
    --delivery-destination-arn arn:aws:logs:us-east-1:DESTINATION_ACCOUNT_ID:delivery-destination:DELIVERY_DESTINATION_NAME \
    --region us-east-1
    注: DESTINATION_ACCOUNT_IDDELIVERY_DESTINATION_NAME をそれぞれ実際の値に置き換えてください。
  9. アカウント A で CloudFront ディストリビューションに対する操作を行い、ディストリビューションがアカウント B 内の S3 バケットにログを配信したことを確認します。
    注: ログがバケットに表示されるまでに数分かかる場合があります。

関連情報

Cross-account delivery example (クロスアカウント配信の例)

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ