S3 のデフォルト暗号化 AWS-KMS を選択していると CloudWatch Logs のログを S3 にエクスポートできない

CloudWatch Logs のログを S3 バケットにエクスポートできなくてハマりました。 備忘録として事象、原因、解決方法を残しておきます。
2019.09.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、岩城です。

CloudWatch Logs のログを S3 バケットにエクスポートできなくてハマりました。 備忘録として事象、原因、解決方法を残しておきます。

事象

CloudWatchLogs のログを S3 バケットにエクスポートする Lambda 関数を書きました(コード内容は本エントリに直接関係ないので割愛します)。 関数を実行すると次のようなエラーが出力されました。

{
  "errorMessage": "An error occurred (InvalidParameterException) when calling the CreateExportTask operation: PutObject call on the given bucket failed. Please check if CloudWatch Logs has been granted permission to perform this operation.",
  "errorType": "InvalidParameterException",
  "stackTrace": [
      割愛
  ]
}

おや?

はじめに、バケットポリシーの間違いを疑いました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-1.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<エクスポート先バケット名>*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-1.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::<エクスポート先バケット名>"
        }
    ]
}

CloudWatch Log からの PutObject は許可されているようです。

では、なぜ・・

つぎに、Lambda からエクスポートするのではなく、マネジメントコンソールから試してみることにしました。 実行してみるとエラーになりましたが、エラーメッセージが違います。

選択したバケットの ACL アクセス許可が不正です。Amazon S3 バケットは、エクスポートするログデータと同じリージョンに存在している必要があります。 (日本語コンソール)

コンソールの表示言語を English にして出力されるエラーメッセージも記載しておきます。

The ACL permission for the selected bucket is not correct. The Amazon S3 bucket must reside in the same region as the log data that you want to export. (Englishコンソール)

ACL アクセス許可が不正ということでしたが、特に間違っているようなことはなさそうでした。

原因と解決方法

前置き長くなりました。 エラーメッセージから辿り着くのは中々難しかったのですが、ドキュメントにしっかり書いてありました。

AWS-256 で暗号化された S3 バケットへのエクスポートがサポートされています。SSE-KMS で暗号化された S3 バケットへのエクスポートはサポートされていません。

引用:Amazon S3 へのログデータのエクスポート

そう、デフォルト暗号化で AWS-KMS を選択していることが原因でした。 AES-256 に変更すると、Lambda やマネジメントコンソールからのエクスポートが行われました。

おわりに

原因が分かるまで大分時間が掛かってしまったのですが、解決できて良かったです。

本エントリがどなたかのお役に立てれば幸いです。