はじめに
本記事は「AWS-GUILD Advent Calendar 2023」の19日目の記事です。
Terraformを利用して、以下の構成を作成します。
構成自体は非常にシンプルです。
Terraformのフォルダ構成
.
├── backend.tf
├── main.tf
├── modules
│ ├── api-gateway
│ │ ├── aws_api_gateway_rest_api.tf
│ │ ├── ...
│ │ ├── output.tf
│ │ └── variables.tf
│ ├── iam
│ │ ├── aws_iam_role.tf
│ │ └── output.tf
│ └── lambda
│ ├── aws_lambda_function.tf
│ ├── src
│ │ └── helloworld.py
│ ├── ...
│ ├── data.tf
│ ├── output.tf
│ └── variables.tf
├── provider.tf
└── variables.tf
今回はTerraformのmodule構成でフォルダ構造を作成しております。
詳しくはGitHubを参照。
各リソースの設定
API Gateway
複数のリソースがありますが、Lambda統合部分のみ抜粋します。
以下の通り、Lambdaモジュールから変数を受け取り、ARNをuriに設定します。
残りの細々とした設定を行うことで、Lambda統合が完成します。
注意点としてはAWS_PROXY
としてtype
を設定する必要があるということです。
resource "aws_api_gateway_integration" "lambda" {
rest_api_id = aws_api_gateway_rest_api.lambda.id
resource_id = aws_api_gateway_resource.lambda.id
http_method = aws_api_gateway_method.lambda.http_method
type = "AWS_PROXY"
uri = var.lambda.function_invoke_arn
integration_http_method = "POST"
}
Lambda
以下のような形でLambda関数を定義します。
role
にはIAMモジュールで定義したものを利用します。
関数本体はsrc
ディレクトリに記載しているため、archive_file
モジュールを利用して、圧縮したzipファイルをLambda関数として登録します。
resource "aws_lambda_function" "helloworld" {
function_name = "api-gateway-sample"
role = var.role
handler = "helloworld.lambda_handler"
runtime = "python3.11"
filename = "${path.module}/archive/helloworld.zip"
}
data "archive_file" "sample_function" {
type = "zip"
source_dir = "${path.module}/src"
output_path = "${path.module}/archive/helloworld.zip"
}
その他
その他のリソースとして、独自ドメインを利用する場合はRoute 53の設定が必要です。
data "aws_route53_zone" "aws" {
name = "aws.tessy.dev"
}
resource "aws_route53_record" "api" {
name = aws_api_gateway_domain_name.api.domain_name
type = "A"
zone_id = data.aws_route53_zone.aws.zone_id
alias {
evaluate_target_health = true
name = aws_api_gateway_domain_name.api.regional_domain_name
zone_id = aws_api_gateway_domain_name.api.regional_zone_id
}
}
リソースの作成
本プロジェクトでは、Terraform Cloudを利用しております。
本記事ではTerraform Cloudの設定は割愛しますが、実行環境をCloudに移すことが出来、plan
実行を確認して、apply
を承認する。
みたいなことも出来るので、複数人での作業が容易になったりします。
通常は、以下のコマンドを実行してください。
terraform plan
terraform apply
接続確認
まとめ
API GatewayとLambda統合はマネジメントコンソールだとポチポチするだけで様々なリソースが作成されます。
これをTerraformで作成した場合、思ったよりも多くのリソースを作成することになります。
最初は苦労しますが、一度作成すると内部のリソースの動きが把握できたりしてとても勉強になるのでおすすめです。