下記の記事でCloudFormationのスタックを削除しても、S3にオブジェクトが存在すると削除できなかった。
カスタムリソースでLambdaを使用してオブジェクトを削除するようにする。
今回作成するLambdaはほかのCloudFormationでも使用することがあると思うので、別のyamlファイルとして作成する。
注意:上記記事で作成したyamlファイルでスタックを作成する前に下記ファイルでLambda(カスタムリソース)を作成しておく必要がある。
Lambda用yaml作成
こちらの記事を参考に作成
※LambdaFunction の Runtime: python3.7 が現在 python3.12になっているので変更
LambdaFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: s3delete
Role: !GetAtt s3deletelambda.Arn
Runtime: python3.12 # ←ここ
Lambdaのコードはこちらの記事を参考
※まだLambdaに設定が必要なので、Lambdaのスタックのみ作成してください。
これでLambdaを使用してCloudFormationスタックを削除するタイミングでS3オブジェクトを削除するようになりました。
しかし、Lambdaの部分で下記エラーが発生してしまいます。
[ERROR] Runtime.ImportModuleError: Unable to import module 'index': No module named 'requests' Traceback (most recent call last):
どうやらrequestsのバージョンがpython3.12に対応していないようです。
エラー対応
作成したLambdaにレイヤーを追加します。
・Labdaの右下にあるレイヤーの追加を選択
・下記サイトからから対象ライブラリのARNを取得します。
https://github.com/keithrozario/Klayers/tree/master/deployments
・東京リージョンで作成しているので Asi Pacific(Tokyo)のhtmlを選択
・requestsのARNが欲しいので Package: requests のarnをコピー
・LambdaのレイヤーのARNを指定に張り付けて追加すればOK
これでS3やCodePipelineのCloudFormationスタックを実行してもエラーにならないはずです。
エラーになる場合は同じ手順でライブラリーを追加してみてください。
※ライブラリ追加せずに実行すると1時間ほど本当に処理が固まるので注意してください。
以上