My Note

自己理解のためのブログ

TerraformでAWSの環境構築 ( Lambda )

やったこと

Terraformを利用してAWS環境のlambda-functionを作成する。

  • lambda-functionの設定
    • ラインタイム: go1.x
    • ハンドラー: main
    • 環境変数をセット
    • Goのコードをアップロード
    • IAMロール付与
    • タイムアウト時間
    • 割り当てメモリ

実行環境

$ terraform --version

Terraform v0.12.0
+ provider.aws v2.13.0

lambda-functionをつくる

公式Doc: Resource: aws_lambda_function

■ IAMロール

lambda-basic-execution というIAMロールは事前に作成したものをセットした。

data "aws_iam_role" "basic" {
  name = "lambda-basic-execution"
}

■ Lambdaの設定 ( handler / runtime / timeout / memory_size )

よく設定するパラメータは以下のようにセットした。

  handler       = "main"
  runtime       = "go1.x"
  memory_size   = 128
  timeout       = 10

f:id:yhidetoshi:20190621232417p:plain

環境変数

environment {
    variables = {
      CHANNEL    = var.channel
      WEBHOOKURL = var.webhookurl
    }
  }

f:id:yhidetoshi:20190621232441p:plain

Terraformのコード全体

ディレクトリ構造(一部抜粋)

├── external
│   └── lambda
│       └── codepipeline-slack.zip
├── lambda.tf
├── modules
│   ├── lambda
│   │   └── main.tf

external/lambda/にlambdaに展開するGoファイルをzip圧縮したものを配置

■ Resource側 ( modules/lambda/main.tf )

variable "function_name" {}
variable "filename" {}
variable "handler" {}
variable "runtime" {}
variable "channel" {}
variable "webhookurl" {}
variable "memory_size" {}
variable "timeout" {}

data "aws_iam_role" "basic" {
  name = "lambda-basic-execution"
}

resource "aws_lambda_function" "lambda" {
  function_name = var.function_name
  filename      = var.filename
  handler       = var.handler
  role          = data.aws_iam_role.basic.arn
  runtime       = var.runtime
  memory_size   = var.memory_size
  timeout       = var.timeout

  environment {
    variables = {
      CHANNEL    = var.channel
      WEBHOOKURL = var.webhookurl
    }
  }
}

■ Module側 (lambda.tf)

module "create_lambda_codepipeline_slack" {
  source        = "./modules/lambda"
  function_name = "codepipeline-slack"
  filename      = "./external/lambda/codepipeline-slack.zip"
  handler       = "main"
  runtime       = "go1.x"
  memory_size   = 128
  timeout       = 10
  channel       = "test"
  webhookurl    = "https://hooks.slack.com/services/XXXXX"
}

まとめ

Terraformを利用してAWS lambda-functionを作成しました。 Goのコードのzip圧縮や環境変数・実行環境などを自動化できるので、テンプレート化して 構築すると便利かも。