329-AWS SAP AWS 「理論・実践・一問道場」カスタムリソース

 

理論

1. AWS CloudFormation

  • AWS CloudFormationは、AWSリソースをテンプレートから自動的に作成、管理、削除できるサービスです。これを使うことで、手動でリソースを設定する手間を省き、インフラの管理をコード化できます。

2. カスタムリソース

  • カスタムリソースは、CloudFormationテンプレート内で定義する特別なリソースで、AWSの標準リソースだけでは解決できないような処理を自動化するために使われます。たとえば、Lambda関数を使用してS3バケット内のファイルを削除するなどのカスタムな操作を行うことができます。
具体的な流れとしては以下の通りです:
  1. Lambda関数:まず、Lambda関数を作成し、S3バケット内のオブジェクトを削除する処理を記述します。
  1. カスタムリソース:次に、CloudFormationテンプレート内でこのLambda関数をカスタムリソースとして定義します。このカスタムリソースをスタックの削除前に呼び出すように設定します。
  1. DependsOn属性:カスタムリソースでLambda関数を呼び出した後、S3バケットの削除を行いたいため、DependsOn属性を使用して、Lambda関数の削除が完了してからS3バケットの削除が行われるように順序を指定します。

3. AWS Lambda

  • AWS Lambdaは、サーバーを管理することなくコードを実行できるサービスです。イベント(例えばCloudFormationスタックの削除時)に基づいてコードを自動的に実行できます。CloudFormationのカスタムリソースとしてLambdaを使うと、特定の操作(ファイル削除など)を行うことができます。

4. S3バケットとオブジェクト

  • Amazon S3は、データを保存するためのオブジェクトストレージサービスです。バケットはデータを保存する容器であり、その中に「オブジェクト」(ファイル)が格納されます。S3バケットやその中のオブジェクトをCloudFormationで削除する場合、バケット内のオブジェクトを先に削除しないとバケットの削除が失敗します。

5. DependsOn属性

  • DependsOn属性は、CloudFormationでリソースの削除や作成を順番に実行するために使います。例えば、S3バケットを削除する前に、その中のオブジェクトを削除してからバケットを削除したい場合に使います。

解決方法

この問題では、CloudFormationスタックを削除する際にS3バケット内のオブジェクトが残っていると削除に失敗することがあります。Lambda関数を使って、CloudFormationスタックの削除前にS3バケット内のオブジェクトを削除するようにすると、問題が解決します。この操作は「カスタムリソース」としてCloudFormationに組み込むことができ、DependsOn属性を使って削除順序を管理することができます。

まとめ

  • CloudFormationでリソース管理を自動化できる。
  • Lambda関数を使って、CloudFormationで削除できないものを削除できる。
  • S3バケットの削除には、まずバケット内のオブジェクトを削除する必要がある。
  • DependsOnを使って、削除の順序を制御することができる。
このような方法を使うことで、AWSでのリソース管理が効率よく、エラーなく行えるようになります。

実践

一問道場

質問 #329
ある金融サービス会社は、Amazon EC2インスタンスとAWS Lambda関数で複雑なマルチティアアプリケーションを実行しています。このアプリケーションは、一時的なデータをAmazon S3に格納します。S3オブジェクトは45分間のみ有効で、24時間後に削除されます。会社はアプリケーションの各バージョンを、AWS CloudFormationスタックを起動することによって展開します。スタックは、アプリケーションを実行するために必要なすべてのリソースを作成します。会社が新しいアプリケーションバージョンを展開して検証した後、古いバージョンのCloudFormationスタックを削除します。しかし、会社は最近、古いアプリケーションバージョンのCloudFormationスタックを削除しようとしましたが、その操作は失敗しました。分析によると、CloudFormationは既存のS3バケットを削除できませんでした。ソリューションアーキテクトは、アプリケーションのアーキテクチャに大きな変更を加えることなくこの問題を解決する必要があります。
どのソリューションがこれらの要件を満たしていますか?
A. 与えられたS3バケットからすべてのファイルを削除するLambda関数を実装し、このLambda関数をCloudFormationスタックのカスタムリソースとして統合します。カスタムリソースには、S3バケットのリソースを指すDependsOn属性が必要です。
B. CloudFormationテンプレートを変更して、一時的なファイルをAmazon S3ではなくAmazon Elastic File System (Amazon EFS)ファイルシステムに格納するようにします。Lambda関数をファイルシステムと同じVPC内で実行するように構成し、EC2インスタンスとLambda関数にファイルシステムをマウントします。
C. CloudFormationスタックを変更して、S3オブジェクトが作成されてから45分後に期限切れとなるS3ライフサイクルルールを作成します。S3バケットのリソースを指すDependsOn属性を追加します。
D. CloudFormationスタックを変更して、S3バケットにDeleteという値のDeletionPolicy属性を追加します。

解説

この問題では、AWS CloudFormationスタックを削除する際にS3バケットが削除できない問題について解決策を求められています。特に、S3オブジェクトが削除されるべきなのに、スタックの削除時にバケット削除が失敗するというシナリオです。

解説

A. Lambda関数を実装し、CloudFormationのカスタムリソースとして統合する

  • 適切な解決策です。
  • このアプローチでは、CloudFormationスタックの削除時にカスタムリソースを使用してS3バケット内のオブジェクトを削除します。Lambda関数をカスタムリソースとして使用することで、S3バケット内のファイルが削除された後にバケット自体を削除するようにできます。また、DependsOn属性を使って、S3バケットのリソース削除を確実に待つことができます。

B. Amazon EFSに変更し、ファイルシステムをEC2インスタンスやLambda関数にマウントする

  • 不適切です。
  • Amazon EFSを使用することは、一時的なデータのストレージにおいて有効ですが、このシナリオではアプリケーションの変更を最小限に抑える必要があります。既存のS3バケットをEFSに移行することで、アーキテクチャに大きな変更が加わり、要件に反します。

C. S3ライフサイクルルールを作成し、オブジェクトの有効期限を45分に設定する

  • 不適切です。
  • ライフサイクルルールを設定してオブジェクトを期限切れにすることは可能ですが、オブジェクトの削除が即座に行われるわけではありません。また、CloudFormationの削除時にS3バケット自体を削除する際には、オブジェクトがすでに削除されている必要があり、この方法では不十分です。

D. S3バケットにDeletionPolicy属性を設定して削除する

  • 不適切です。
  • DeletionPolicy属性の設定は、CloudFormationスタックの削除時にリソースを保持するか削除するかを指定するものであり、バケット内のオブジェクトが削除されない限り、バケット自体を削除することができません。この方法は、S3オブジェクトの削除に関する問題を解決するものではありません。

最適な解決策

Aの方法が最も適切です。Lambda関数を使用して、CloudFormationのスタック削除時にS3バケット内のオブジェクトを確実に削除し、その後バケット自体を削除するプロセスを管理できます。この方法は、アプリケーションのアーキテクチャにほとんど変更を加えることなく問題を解決できます。
330-AWS SAP AWS 「理論・実践・一問道場」API Gateway ゲーム328-AWS SAP AWS 「理論・実践・一問道場」予防的ガードレール
Loading...
minami
minami
みなみの成長 🐝
Announcement

🎉 ブログへようこそ 🎉

名前: みなみ一人会社
性別:
国籍: China 🇨🇳
政治スタンス: 民主主義支持者
完全独学で基本情報技術者をはじめ、32個の資格を仕事をしながら取得。
現在はIT会社で技術担当として働きながら、ブログ執筆や学習支援にも取り組んでいます。
独学で合格できる学習法や勉強法、試験対策を発信中!

📚 発信内容

  • 💻 IT・システム開発
  • 🏠 不動産 × 宅建士
  • 🎓 MBA 学習記録