memo.log

主に技術的な内容の記録に。たまにお役立ち情報も載せたい。

Terraform で Lambdaファンクションをデプロイする最低限の手順メモ

概要

TerraformでLambdaファンクションをデプロイする最低限だけ書いたメモ。

以下に資材一式がある。

https://github.com/kuredev/test-lambda-circleci/tree/minimum-lambda

前提

  • terraform がインストール済であること
    • tfenv が使いやすそう
  • AWSの認証情報が設定されていること(環境変数かホームディレクトリの .aws配下等)
  • デプロイするLambdaファンクションの仕様

手順

Lambdaファンクションのソースコードを準備

src/lambda_handler.rb

require "json"

class LambdaHandler
  def self.lambda_handler(*)
    puts "hogehoge"

    { result: true }
  end
end

Terraformファイルを準備

main.tf

provider "aws" {
    region = "ap-northeast-1"
}

resource "aws_lambda_function" "test-terraform" {
  filename         = data.archive_file.test-terraform.output_path
  function_name    = "test-terraform" 
  role             = aws_iam_role.test-terraform.arn 
  handler          = "lambda_handler.LambdaHandler.lambda_handler" 
  runtime          = "ruby2.7" 
  source_code_hash = data.archive_file.test-terraform.output_base64sha256
}

data "archive_file" "test-terraform" {
  type        = "zip"
  source_dir  = "./src"
  output_path = "tmp/test-terraform.zip"
}

data "aws_iam_policy_document" "test-terraform" {
  statement {
    actions = [
      "sts:AssumeRole"
    ]
    principals {
      type        = "Service"
      identifiers = ["lambda.amazonaws.com"]
    }
  }
}

resource "aws_iam_role" "test-terraform" {
  name               = "test-terraform-role"
  assume_role_policy = data.aws_iam_policy_document.test-terraform.json
}

resource "aws_iam_role_policy_attachment" "test-terraform" {
  role       = aws_iam_role.test-terraform.id
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}

デプロイ

$ terraform init 
$ terraform deploy

関連リンク

lambda_function | Resources | hashicorp/aws | Terraform Registry https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function