6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS-GUILDAdvent Calendar 2023

Day 19

Terraformを利用して、API Gateway+Lamba構成を作成してみる。

Last updated at Posted at 2023-12-18

はじめに

本記事は「AWS-GUILD Advent Calendar 2023」の19日目の記事です。

Terraformを利用して、以下の構成を作成します。
構成自体は非常にシンプルです。

構成図
api-gatway-lambda-integration.drawio.png

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を設定する必要があるということです。

api-gateway
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関数として登録します。

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の設定が必要です。

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

接続確認

こんな感じで無事に接続できたら成功です。
image.png

まとめ

API GatewayとLambda統合はマネジメントコンソールだとポチポチするだけで様々なリソースが作成されます。
これをTerraformで作成した場合、思ったよりも多くのリソースを作成することになります。
最初は苦労しますが、一度作成すると内部のリソースの動きが把握できたりしてとても勉強になるのでおすすめです。

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?