1
0

カスタムリソースを使用してS3内オブジェクトを削除

Last updated at Posted at 2024-04-26

下記の記事で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の右下にあるレイヤーの追加を選択
image.png

・ARNを指定を選択
image.png

・下記サイトからから対象ライブラリのARNを取得します。
https://github.com/keithrozario/Klayers/tree/master/deployments

・東京リージョンで作成しているので Asi Pacific(Tokyo)のhtmlを選択
image.png

・requestsのARNが欲しいので Package: requests のarnをコピー
image.png

・LambdaのレイヤーのARNを指定に張り付けて追加すればOK
image.png

これでS3やCodePipelineのCloudFormationスタックを実行してもエラーにならないはずです。
エラーになる場合は同じ手順でライブラリーを追加してみてください。
※ライブラリ追加せずに実行すると1時間ほど本当に処理が固まるので注意してください。

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0