はじめに
Terraformを使ってAWS Lambdaを構築する際に、「Lambdaが利用するリソースで何ができるのか」「そのリソースの引数に何を指定すべきか」が分からず手間取ったので、簡単に整理しました。
Lambda構築に使用したTerraformコード
以下は、Terraformを使ってLambdaを作成するためのコード例です。
# Lambda
data "archive_file" "lambda_function_file" {
type = "zip"
source_dir = "./src/"
output_path = "./upload/lambda_function.zip"
}
resource "aws_lambda_function" "get_gang_info" {
filename = data.archive_file.lambda_function_file.output_path
function_name = "get_gang_info"
role = aws_iam_role.dynamodb_read_only.arn
handler = "lambda_function.lambda_handler"
source_code_hash = data.archive_file.lambda_function_file.output_base64sha256
runtime = "python3.12"
timeout = 29
}
resource "aws_lambda_permission" "tr_lambda_permit" {
statement_id = "get_gang_info_api"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.get_gang_info.arn
principal = "apigateway.amazonaws.com"
source_arn = "${aws_api_gateway_rest_api.get_gang_info_api.execution_arn}/*/GET/gang"
}
使用したリソースと指定する内容
1. archive_file
機能
Lambda関数用のスクリプトファイルをZIP化します。
archive_fileを使用するには、Terraformのプロバイダーとしてhashicorp/archiveをrequired_providersに追加する必要があります。
主な引数
引数 | 指定する内容 |
---|---|
type | zipを指定する |
soruce_dir | スクリプトが格納されたフォルダを指定する |
output_path | zip化したフォルダの出力先を指定する |
2. aws_lambda_function
機能
Lambda関数を作成します。
主な引数
引数 | 指定する内容 |
---|---|
filename | zip化したファイルのパスを指定する |
function_name | Lambda関数名を指定する |
role | 他のAWSサービスに対してアクションを実行するのに必要なロールを指定する |
handler | スクリプトにあるメイン関数を指定する |
source_code_hash | 「archive_file.ラベル名.output_base64sha256」で指定する |
runtime | スクリプトで使用した開発言語を指定する |
timeout | スクリプトで使用した開発言語を指定する |
runtime | スクリプト処理の制限時間を指定する |
3. aws_lambda_permission
機能
他のAWSサービスにLambda関数の呼び出し権限を付与します。
主な引数
引数 | 指定する内容 |
---|---|
statement_id | アクセス権の名前を指定する |
action | 「lambda:InvokeFunction」ポリシーを指定する |
function_name | Lambda関数のARNを指定する |
principal | アクセス権を与えるAWSサービスのプリンシパルを指定する |
source_arn | アクセス権を与えるAWSサービスのARNを指定する |
おわりに
今回のコード例は、基本的な構築に焦点を当てていますが、こちらの記事が小さな疑問や不明点を解消する一助となれば幸いです。次のステップとして、サービスからの呼び出しをシミュレーションする方法や、エラーハンドリングのパターンにも挑戦していきたいと考えています。
参考
https://registry.terraform.io/providers/hashicorp/archive/latest/docs/data-sources/file
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission