- 公開日
- 最終更新日
【AWS CDK】Assetでつまずいたこと
この記事を共有する
目次
はじめに
こんにちは、パーソル&サーバーワークスのEndoです。
AWS CDK で AWS Lambda(以下、Lambda)を作成・更新する際に、Lambda のコードサイズが大きくなりすぎて cdk deploy 時にエラーとなりました。
この場合、Amazon S3(以下、S3)にソースコードを zip 化して配置することでエラー回避ができるのですが、実装の際につまずいたポイントがあったため、本記事に内容をまとめたいと思います。
Asset について
AWS CDK には Asset と呼ばれる機能が存在します。
アセットは、AWS CDK ライブラリやアプリケーションにバンドルできるローカルファイル、ディレクトリ、または Docker イメージです。例えば、アセットは、AWS Lambda 関数のハンドラーコードを含むディレクトリである場合があります。アセットは、アプリが動作するために必要なアーティファクトを表すことができます。
※ アセットと AWS CDK より引用
まとめると、Asset は、AWS CDK で使用するファイル( Lambda 関数コードや Dockerファイルなど)を AWS にアップロードして使う仕組み です。
Asset には以下のタイプが存在します。
- Amazon S3 Asset:S3にアップロードするファイルやディレクトリ
- Docker Image:Amazon ECR にアップロードする Docker イメージ
今回は S3 Asset を使用して Lambda 関数コードをアップロードしようと考えました。
つまずいたこと
前述の Asset の仕組みを使って Lambda のデプロイエラーを回避しようと考え、任意の S3 バケットを指定する形で cdk deploy を試みましたが、次のような仕様があり実現できませんでした。
Asset 先に指定できるバケットは cdk bootstrap で作成したバケットのみ
cdk bootstrap とは、AWS CDK が AWS 環境へリソースをデプロイするために必要なリソースを準備する処理のことです。
Asset で使用される S3 バケットは この cdk bootstrap で作成されたバケット(デフォルト値:cdk-{Qualifier}-assets-{Account-ID}-{Region})となります。
CDK アプリケーションを適切にデプロイするには、合成中に生成される CloudFormation テンプレートが、ブートストラップ中に作成されるリソースを正しく指定している必要があります。これらのリソースは、一般的にブートストラップリソースと呼ばれます。ブートストラップは、デプロイの実行とアプリケーションアセットの管理に AWS CDK が使用するリソースを AWS 環境に作成します。
※ AWS CDK ブートストラップをカスタマイズする より引用
公式ドキュメントにはきちんと記載されており、私が見落としてしまっていたため、デプロイエラーとなっていました。
任意の S3 バケット指定をやめることで、エラーが発生せず、正常にデプロイできました。
Custom Resource による回避が可能
Asset を使えない/使いたくない場合、今回の例では Lambda 関数用の zip ファイルを任意のバケットへ格納することが可能です。
この場合は、手動管理する、または独自に Custom Resource を作成し、ファイル更新時にアップロードするような自動更新の仕組みを実装する必要があります。
今回の例では、以下の処理を Custom Resource に組み込む必要があります。
- ソースコードの zip 化
- ファイルの変更検知(ハッシュ作成)
- S3 へのアップロード
Asset を使用する場合は、ソースコードが変更されたら次回デプロイ時に自動でファイルを更新してくれるため、手動での管理は別途開発などの手間がかかることをご留意ください。
おわりに
AWS CDK の仕様について、まだ理解できていないことが多いため、日々学習しながら使っていきたいと思います。
本記事がどなたかのご参考になれば幸いです。
関連記事
この記事は私が書きました
S.Endo
記事一覧コーヒーインストラクター検定2級を所持しているエンジニアです。コーヒーを飲みながら仕事をしています。