🔖

SAMで作ったLambdaとSQL間のイベントソースマッピングが残って消えなくなったのをコマンドで削除した話

2023/12/01に公開

はじめに

タイトルそのままです。

結論から先に

コンソールからはイベントソースマッピングのみは消せません。
CLIで消せます。

# イベントソースマッピングの確認
aws lambda list-event-source-mapping

# イベントソースマッピングの削除
aws lambda delete-event-source-mapping --uuid {uuid}

状況

SAMアプリケーションのデプロイをCI/CD化している最中で発生。
デプロイ時の権限を最小にしようとして、デプロイ実行して不足している権限が無くてエラーになったら権限を追加してまたデプロイ。
と繰り返していたら発生しました。

エラーによりデプロイがこけたので、ロールバックが発生し、リソースは削除済みの状態。
なので、コンソールでSQSのページを見ても、Lambdaのページを見てもリソースが存在しません。
間を繋ぐイベントソースマッピングだけがゴミとして残った状態に。

エラーメッセージ

これはCloudformationsのスタックのエラーメッセージです。

Resource handler returned message: "An event source mapping with SQS arn (" arn:aws:sqs:{リージョン}:{アカウント}:{キュー名} ") and function (" {ファンクション名} ") already exists. Please update or delete the existing mapping with UUID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (Service: Lambda, Status Code: 409, Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)" (RequestToken: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, HandlerErrorCode: AlreadyExists)

原因

デプロイ中の不足している権限を順次追加していっているのですが、通常時は作成や更新系の権限を追加すればよいのですが、エラーが発生した場合、ロールバックするため、作ったものは当然削除します。
今回の場合は、

  • 前回のデプロイ時に作成の権限("lambda:CreateEventSourceMapping")を追加
  • デプロイしたところ、他の権限が不足しているエラーが発生し、ロールバック
  • ロールバックしようとしたが、削除の権限("lambda:DeleteEventSourceMapping")が無く、削除不
    となってしまったと思われます。

対策

コンソール上からは消せないので、CLIで削除します。

# イベントソースマッピングの確認
aws lambda list-event-source-mapping

{
    "EventSourceMappings": [
        {
            "UUID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
            "BatchSize": 10,
            "MaximumBatchingWindowInSeconds": 0,
            "EventSourceArn": "arn:aws:sqs:us-east-1:{アカウント}:{キュー名}",
            "FunctionArn": "arn:aws:lambda:us-east-1:{アカウント}:function:{ファンクション名}",
            "LastModified": "2023-12-01T09:10:38.168000+09:00",
            "State": "Enabled",
            "StateTransitionReason": "USER_INITIATED",
            "FunctionResponseTypes": []
        }
    ]
}
# イベントソースマッピングの削除
aws lambda delete-event-source-mapping --uuid {uuid}

{
    "UUID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "BatchSize": 10,
    "MaximumBatchingWindowInSeconds": 0,
    "EventSourceArn": "arn:aws:sqs:us-west-2:{アカウント}:{キュー名}",
    "FunctionArn": "arn:aws:lambda:us-west-2:{アカウント}:function:{ファンクション名}",
    "LastModified": "2023-12-01T10:06:11.991000+09:00",
    "State": "Deleting",
    "StateTransitionReason": "USER_INITIATED",
    "FunctionResponseTypes": []
}

まとめ

  • SAM(Cloudformation)でデプロイする際に必要な権限は追加と削除の権限をセットで付与しましょう。
  • コンソールで見つけられないリソースはCLIで削除できます。

Discussion