削除済みLambdaのS3トリガーが複数残っていたらまとめて断捨離しよう

断捨離が 今日もできずに 夏過ぎる
2021.08.30

大雨続きで夏も終わったか?と思ったら見事に残暑がぶり返してきましたね。

▲ 麦茶を無限に飲むので水出しパックとポットを導入しました

こんにちは。Shirotaです。
色々間違えてポチった麦茶のパックが150個くらいあるので半年弱は生き延びられそうです。
さて、今日はそんな残暑の中「LambdaのS3トリガーで何の操作もできなくなってしまった」お話しをしたいと思います。
結論としては既に記事のタイトルに書いてしまっているのですが、 見なかったことにして 改めて以下のお話に付き合って頂けますと幸いです。

ある日起こったことダイジェスト(皆さんも一緒に考えてみて下さい)

ある日、私はLambdaのS3トリガーを削除しようとしました。
そしたら、「Unable to validate the following destination configurations」のエラーが表示されて削除ができませんでした。
あれ?と思いトリガー周りの操作を試してみたところ、 トリガーの新規追加・変更・削除全ての操作で上記のエラーが出て実施できませんでした

▲ 個人的によく分からなくてとても苦手なエラーです

Lambda自体は既存のS3トリガーがコンソールから確認できているので、ポリシーステートメントも正しくアクセス権限の付与がされていることが確認できています。
リソースベースのポリシーステートメントについては、以下エントリに分かりやすい解説が載っているのでそちらをご参照下さい。

Lambda側に問題がなさそうだと考え、今回トリガーとなるS3を確認してみることにしました。
すると、 既に削除されているLambdaのイベント通知が残っていることに気付きました。

▲ お前ー!

こいつが悪さしているのではないか?と思いコンソールから削除しようとしました。
まずはhoge.jpgのイベント通知から削除してみます。

▲ 安らかに眠って頂きます

やったか……!?

▲ 上記と同じスクショにしか見えませんが削除押下後です

フラグを建ててみた通り、削除ができませんでした。エラーも特に表示されず、消えないイベント通知だけがそこにありました。

コンソール上からダメでもCLIならいけるかな?と僅かな望みをかけてCLIからアプローチしてみます。
初めに出たエラー文で検索すると、以下のAWS公式ページが見つかります。

今回は、対象のLambdaが削除済みのためLambda関連のコマンドは使えません。
そのため、S3に関するイベント通知を変更するコマンドput-bucket-notification-configurationを使って、hoge.jpgの設定を削除したJSONファイルでイベント通知の設定を上書きしてみることにしました。

$ aws s3api put-bucket-notification-configuration --bucket test-cloudwatch-trigger --notification-configuration file://shirota-notification.json

An error occurred (InvalidArgument) when calling the PutBucketNotificationConfiguration operation: Unable to validate the following destination configurations

コンソールの時と同様のエラーが出てしまいました。 詰んだ……

ちなみに、コンソール及びCLIで上記エラーが出た時、CloudTrailでは以下のエラーが記録されていました。

...
    "eventTime": "2021-08-30T08:39:37Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "PutBucketNotification",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "XXX.XXX.XXX.XXX",
    "userAgent": "[aws-internal/3 aws-sdk-java/1.11.1030 Linux/5.4.129-72.229.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.302-b08 java/1.8.0_302 vendor/Oracle_Corporation cfg/retry-mode/legacy]",
    "errorCode": "InvalidArgument",
    "errorMessage": "Unable to validate the following destination configurations",
...

答え合わせと解決方法

ある日私に起こったことは以上です。どうですか?分かりましたでしょうか?(私は分かりませんでした)
ここからは皆さん気になっているであろう原因と解決方法についてお話しします。

「Unable to validate the following destination configurations」が出ていた原因

上記のエラーが出ていた原因は、初めの推測が当たっており「 削除済みのLambdaのトリガーが当該S3に残っていた 」ことにありました。
Lambdaを削除しても、そのLambdaのログやIAMロール、トリガーは連動して削除されません
Lambda以外のリソースが絡むものは残るようです。

「Unable to validate the following destination configurations」の解決方法

解決方法としては、原因である削除済みのLambdaのトリガーをS3のイベント通知から削除することです。
ただ、今回「それができないんじゃい!」となってしまいました。なぜでしょうか。

エラーが発生しているS3のイベント通知を見てみたところ、 もう一つ削除済みのLambdaのトリガーが残っていることが分かりました。

▲ hoge以外にもfugaがいました

どうやら、悪さをするイベント通知は 全てまとめて削除しないといけない ようです。

今回は、削除済みのLambdaで作られたイベント通知を二つとも選択して削除を実施したところエラーが出ず削除が成功しました。
CLIでも、対象のイベント通知をまとめて除外したJSONファイルを作成してput-bucket-notification-configurationを実行することで削除が成功することを確認しました。

Happy End

削除済みのLambdaのトリガーを全て削除して、このS3をトリガーとするイベント通知を新規に追加すると今度はエラーが起きずに無事追加されました。

▲ 削除も無事完了し、めでたしめでたし

もうちょっとだけ続くんじゃ、と言うことで今回検証する中で気付いたTipsをおまけとして以下にまとめておきます。
この記事が「Unable to validate the following destination configurations」でお困りの人の助けとなれば幸いです。

おまけ:Lambdaを削除する際の注意ポイント

コンソールからLambdaを単体で削除する時と複数選択して削除する時では、 警告文の内容が異なります
(英訳の問題なのかな?と思い英語コンソールで確認したところ英語でも差異があったのでその文面を掲載します)

▲ Lambdaを単体で削除しようとした時

単体でLambdaを削除しようとした時には、「The related logs and roles are retained in your account.」と表示されており「ログとIAMロールが残る」と言う内容が警告されます。

▲ Lambdaを複数選択して削除しようとした時

複数のLambdaを選択して削除しようとした時には、「The related logs, roles, and triggers are retained in your account.」と表示されており「ログとIAMロールとトリガーが残る」と言う内容が警告されます。

単体のLambda削除の際にもトリガーが残ります
お気をつけ下さい。

おまけ2:CloudShellからJSONファイルを指定してput-bucket-notification-configurationを実行する方法

今回私は、CloudShellからput-bucket-notification-configurationを実行しました。
S3のイベント通知を更新するためには、設定のJSONファイルを作成してコマンド実行時に指定する必要があります。
CloudShellにはファイルをアップロードすることができますので、それを利用してアップロードしたファイルを指定してコマンドを実行しました。

▲ ここからファイルをアップロードできます

アップロードされたファイルは/home/cloudshell-userに配置されます。
アップロードが完了したら以下のコマンドを実行して下さい。

$ aws s3api put-bucket-notification-configuration --bucket バケット名 --notification-configuration file://アップロードしたJSONファイル名

これで、CloudShellからput-bucket-notification-configurationが実行できます。