ある 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 に付与するには、次の手順を実行します。
- アカウント A で標準ログ記録 (v2) を設定します。
注: 標準ログを有効にするには、プロプランまたは従量制料金プランを使用する必要があります。詳細については、「Amazon CloudFront の料金」を参照してください。
- アカウント 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_NAME、SOURCE_ACCOUNT_ID、DISTRIBUTION_ID、ACCESS_LOGS をそれぞれ実際の値に置き換えてください。
- アカウント 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_NAME、PREFIX、SOURCE_ACCOUNT_ID、DELIVERY_SOURCE_NAME をそれぞれ実際の値に置き換えてください。
- アカウント 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_NAME、BUCKET_NAME、PREFIX をそれぞれ実際の値に置き換えてください。アカウント B は、新しい配信先に配信先ポリシーを作成します。このポリシーは、アカウント A にログ配信を作成するアクセス許可を付与します。
- 任意の 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_ID、DESTINATION_ACCOUNT_ID、DELIVERY_DESTINATION_NAME をそれぞれ実際の値に置き換えてください。
- ポリシーに destination-policy-s3.json という名前を付け、ローカルマシンにファイルを保存します。
- アカウント 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 を実際の値に置き換えてください。
- アカウント 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_ID、DELIVERY_DESTINATION_NAME をそれぞれ実際の値に置き換えてください。
- アカウント A で CloudFront ディストリビューションに対する操作を行い、ディストリビューションがアカウント B 内の S3 バケットにログを配信したことを確認します。
注: ログがバケットに表示されるまでに数分かかる場合があります。
関連情報
Cross-account delivery example (クロスアカウント配信の例)