タイトルの通りですが、CloudFrontのログ出力を、legacyから
標準ログ記録(v2) に置き換えようとした所、ConflictException が発生して作成に失敗する事象に悩んでいました。
原因の特定から解決まで若干の時間を要したので、同様の事象で悩んでいる人の参考になればということでメモを残しておきます。
なお、本稿はCloudFormationの書き方については言及していませんのでご注意ください。
CloudFormationと記載していますが、恐らくAWS CLIなどで直接作成しようとする際にも同様の事象が発生する可能性はあるのかなと思います。
事象の確認
前提として、既にあったlegacyのログ出力設定は削除した状態で実行していました。
CloudFormation実行時に出力されたログは以下の通り(該当箇所のみ抜粋)。
{
:
:
"eventSource": "logs.amazonaws.com",
"eventName": "PutDeliverySource",
"awsRegion": "us-east-1",
"sourceIPAddress": "cloudformation.amazonaws.com",
"userAgent": "cloudformation.amazonaws.com",
"errorCode": "ConflictException",
"errorMessage": "This ResourceId has already been used in another Delivery Source in this account.",
"requestParameters": {
:
:
}
ログを見る限り
PutDeliverySource を実行した所、既にリソースが存在しているということらしい。
しかし、画面を見る限り、ログ設定は何もなく、既存の設定を削除する術もない状態でした。

解決方法
画面上で見えないだけで実際にはあるのかも、ということで、AWS CLIでDeliverySourceがあるか確認をしてみます。
なお、今回の解決方法ではAWS CLIの他に
jq も使用しています。
手順
- DeliverySourceの確認
aws logs describe-delivery-sources --region us-east-1 --output json | jq --arg arn "[DestributionのARN]" '.deliverySources[] | select(.resourceArns != null and (.resourceArns | index($arn) != null))'
- 紐づいていたら削除
aws logs delete-delivery-source --name [DeliverySource名] --region us-east-1
実行結果
アカウントIDやDistributionIDなど、結果の一部はダミーに置き換えています。
まずは該当のDistributionに紐づくDeliverySourceがないか確認をする。
$ aws logs describe-delivery-sources --region us-east-1 --output json | jq --arg arn "arn:aws:cloudfront::xxxxxxxxxxxx:distribution/E01234567890" '.deliverySources[] | select(.resourceArns != null and (.resourceArns | index($arn) != null))'
{
"name": "CreatedByCloudFront-E01234567890-ACCESS_LOGS",
"arn": "arn:aws:logs:us-east-1:xxxxxxxxxxxx:delivery-source:CreatedByCloudFront-E01234567890-ACCESS_LOGS",
"resourceArns": [
"arn:aws:cloudfront::xxxxxxxxxxxx:distribution/E01234567890"
],
"service": "cloudfront",
"logType": "ACCESS_LOGS"
}
どうもDeliverySourceがあるらしい。
これが原因で作成が出来ないと思われるので削除する。
前のコマンドで出力された name をコマンドに設定して実行する。
$ aws logs delete-delivery-source --name CreatedByCloudFront-E01234567890-ACCESS_LOGS --region us-east-1
$
実行後、何も出力がされなければ削除できています。
この後CloudFormationを再実行し、ログ設定が作られることを確認しました。
終わりに
解決方法が分かった所でエラーメッセージを読めばそうだよな、と思いますが、原因を突き止めるまではだいぶ長かったです。
DeliverySourceが作られた原因は不明ですが、標準ログ記録(v2)のログ設定を実装するのに色々と試行錯誤をしていたので、その弾みでDeliverySourceが作成されてしまったのかもしれません。
ただ、画面で見えないのは中々罠だったなと思います。