【ITニュース解説】Terraform で AWS Lambda をデプロイしようとする際にぶつかる現実
ITニュース概要
TerraformでAWS Lambdaをデプロイする際、単純にapplyするだけでは済まない場合がある。特に、TypeScriptやGoなどのビルドが必要な言語では、事前のビルドやzipファイル作成、S3へのアップロードなど、追加の手順が必要になる。Terraformはインフラ構築だけでなく、デプロイ周りの設定も考慮する必要がある点を理解する必要がある。
ITニュース解説
この記事は、AWS Lambda関数をTerraformでデプロイする際に、初心者が陥りやすい誤解と、実際に必要な手順について解説している。Terraformは、AWSをはじめとするクラウド環境のリソースをコードで管理するIaC(Infrastructure as Code)ツールとして広く利用されている。Lambda関数をデプロイする際、他のデプロイツール(Serverless Frameworkの`sls deploy`やAWS CDKの`cdk deploy`など)と同様に、Terraformの`terraform apply`コマンドを実行すれば完了すると思いがちだが、実際にはそう簡単ではないという点がこの記事の重要なポイントだ。 特に、TypeScriptやGoといったコンパイルが必要な言語でLambda関数を作成する場合、単純にコードをアップロードするだけでは関数は動作しない。なぜなら、Lambda関数として実行できる形式にするためには、いくつかのステップが必要になるからだ。これらの言語で記述されたコードは、まず実行可能な形式にビルドする必要がある。TypeScriptであればJavaScriptに、GoであればAmazon Linux上で実行可能なバイナリに変換する。 次に、ビルドされたファイル(JavaScriptファイルやバイナリファイル)を、Lambda関数にデプロイするためにアーカイブする必要がある。一般的には、これらのファイルをzip形式で圧縮する。このzipファイルが、Lambda関数の実行に必要なコードを含むデプロイパッケージとなる。 TerraformでLambda関数をデプロイする場合、これらのビルドとアーカイブのステップを自動化する必要がある。Terraform自体は、これらの処理を直接行う機能を持っていないため、追加の工夫が必要となる。よく用いられる方法としては、`null_resource`リソースと`local-exec`プロビジョナーを組み合わせて、これらの処理をTerraformの実行フローに組み込む方法がある。 `null_resource`は、他のリソースへの依存関係を定義するためだけに存在するリソースだ。これ自体は特に何もしないが、依存関係が変更された場合にのみ、関連するプロビジョナーを実行するトリガーとなる。`local-exec`プロビジョナーは、Terraformを実行しているローカル環境でコマンドを実行する機能を提供する。 具体的には、`null_resource`リソースに、Lambda関数のコードが格納されているディレクトリへの依存関係を持たせる。そして、`local-exec`プロビジョナーを使って、ビルドとアーカイブのコマンドを実行する。例えば、TypeScriptのコードをビルドするのであれば、`npm install`や`npm run build`といったコマンドを実行し、Goのコードであれば、`go build`コマンドを実行する。そして、ビルドされたファイルをzip形式で圧縮するコマンドも`local-exec`プロビジョナーで実行する。 最後に、Terraformの`aws_lambda_function`リソースを使ってLambda関数を作成する。このリソースの`filename`引数に、先ほど作成したzipファイルのパスを指定する。これにより、TerraformはzipファイルをLambda関数にアップロードし、デプロイを行う。 このように、TerraformでLambda関数をデプロイするには、コードのビルド、アーカイブ、Lambda関数の作成という一連の流れをTerraformの設定ファイルに記述する必要がある。`terraform apply`コマンドを実行するだけで完了するわけではなく、これらのステップを適切に設定する必要があるという点が、初心者がつまずきやすいポイントだ。 この記事では、これらの手順を具体的なコード例を交えて解説しており、Terraformを使ってLambda関数をデプロイする際の理解を深めることができる。特に、ビルドが必要な言語を使用する場合、Terraformの設定ファイルにこれらの処理を組み込む必要があるという点を理解することが重要だ。