AWS Lambdaのevent sourceが削除出来なくなった時の対処法

AmazonLambda

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

こんにちは、せーのです。昨日に引き続きlambdaでちょっと困ったケースをご紹介します。

ちょっとした出来心

昨日の記事のケースを検証している時に、テスト用にS3バケットを作り、そのS3バケットをlambdaのevent sourceに追加しました。

eventsource1

eventsource3

色々と検証し、ひと通り終わったので何も考えずに要らなくなったS3バケットを削除しました。

eventsource4

ふとLambdaのコンソールを見ると削除したS3バケットをトリガーとするイベントソースが残っていました。

eventsource5

自動で消えてくれるわけではないのね、とこのイベントソースを削除しようとすると

eventsource6

なんとエラーが。そう、イベントソースを削除する前にバケットを削除してしまうとイベントソースが残ってしまうんですね。このイベントソースを消すにはちょっとしたコツがいるんです。

2つの解決法

同名のバケットを作る

1つ目は簡単な方法です。消したバケットと全く同じ名前のバケットをもう一回作って、イベントソース -> バケットの順で削除すれば消えてくれます。
ただし、同名のバケットを再び立ち上げるには削除してから1時間程待つ必要がありますのでご注意下さい。

AWS CLIから消す

2つ目の方法はAWS CLIからコマンドを叩いて消す方法です。AWS CLIでイベントソースを消すには[remove-permission]というコマンドを使います。

remove-permission

パラメータ

  • --function-name : 対象となるLambda function名(ARNを記述)
  • --statement-id : 消したいイベントソースのSid

ここで「イベントソースのSid」が必要になります。イベントソースのSidは[get-policy]というコマンドで確認することが出来ます。

get-policy

パラメータ

  • --function-name : 対象となるLambda function名(ARNを記述)

ではやってみましょう。まずは[get-policy]コマンドでSidを確認します。リージョンを間違えないように注意してくださいね。

seinotsuyoshi$ aws lambda get-policy \
--function-name arn:aws:lambda:us-east-1:887464593869:function:cmS3PutMetadataTest \
--region us-east-1
{
    "Policy": "{\"Statement\":[{\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"887464593869\"},\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::cm-lambda-test\"}},\"Resource\":\"arn:aws:lambda:us-east-1:887464593869:function:cmS3PutMetadataTest\",\"Action\":\"lambda:InvokeFunction\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"},\"Sid\":\"s3_cm-lambda-test\",\"Effect\":\"Allow\"},{\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"887464593869\"},\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::chao2suke-lambda-eventsource\"}},\"Resource\":\"arn:aws:lambda:us-east-1:887464593869:function:cmS3PutMetadataTest\",\"Action\":\"lambda:InvokeFunction\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"},\"Sid\":\"Created_by_S3_Console_on_2015-04-15_02-13-16\",\"Effect\":\"Allow\"}],\"Id\":\"default\",\"Version\":\"2012-10-17\"}"
}
seinotsuyoshi$

なんかごちゃごちゃしてわかりにくいですが[Sid]と書かれている部分がStatement-idです。つまり

"Sid\":\"s3_cm-lambda-test\"

 "Sid\":\"Created_by_S3_Console_on_2015-04-15_02-13-16\"

これですね。今回消す対象は2行目なので[Created_by_S3_Console_on_2015-04-15_02-13-16]ということになります。では消してみましょう。

seinotsuyoshi$ aws lambda remove-permission \
--function-name arn:aws:lambda:us-east-1:887464593869:function:cmS3PutMetadataTest \
--statement-id Created_by_S3_Console_on_2015-04-15_02-13-16 \
--region us-east-1
seinotsuyoshi$

思ったよりあっさり通りました。ではコンソール画面を見てみましょう。

eventsource7

見事消えてくれました。

まとめ

いかがでしたでしょうか。こちらもひらめかないと気づかない系です。ぜひ頭の片隅に入れておきましょう。

参考サイト