LambdaのProvisioned Concurrencyは3rd Partyツールからも既に(というかGA時点から)使えます #reinvent

LambdaのProvisioned ConcurrencyはGAがアナウンスされた日から、各種3rd Partyツールでの設定やメトリクス監視ができます。ということでTerraformで設定してみました。
2019.12.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日GAになった LambdaのProvisioned Concurrencyについて補足します。Provisioned Concurrencyについてまだご存知ない方は以下の弊社岩田の記事をご覧ください。

[速報]コールドスタート対策のLambda定期実行とサヨナラ!! LambdaにProvisioned Concurrencyの設定が追加されました  #reinvent

リリースノートの中にこんな記載があるのに気づかれた方はいらしゃいますでしょうか。

You can also use Provisioned Concurrency today with AWS Partner tools, including configuring Provisioned Currency settings with the Serverless Framework and Terraform, or viewing metrics with Datadog, Epsagon, Lumigo, New Relic, SignalFx, SumoLogic, and Thundra.

GAになったそのタイミングから、AWSパートナーである各種3rd PartyツールからもProvisioned Concurrencyを設定、メトリック監視できるようになっています。これらのツールのユーザーなのであれば、すぐにProvisioned Concurrencyを試すことができて非常に嬉しいですね。

各ツールのリリースノート

Serverless Framework

Terraform

Datadog

Epsagon

Lumigo

New Relic

SignalFx

  • 見つけられず、、

SumoLogic

Thundra

Terraformでやってみた

aws_lambda_provisioned_concurrency_config というリソースが追加されています。

こんな感じのコードを書いて実行してみました。aws_lambda_provisioned_concurrency_configは一番下に書いています。

 resource aws_iam_role hello {
  name = "role_for_lambda"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
    }
  ]
}
EOF
}

locals {
  lambda_zip_file_path = "./src/lambda_function.zip"
}

data archive_file lambda_src {
  type        = "zip"
  source_file = "./src/index.js"
  output_path = local.lambda_zip_file_path
}

resource aws_lambda_function hello {
  filename         = local.lambda_zip_file_path
  function_name    = "${var.basename}-hello-world"
  role             = aws_iam_role.hello.arn
  handler          = "index.handler"
  source_code_hash = filebase64sha256(data.archive_file.lambda_src.output_path)
  runtime          = "nodejs12.x"
}

resource aws_lambda_provisioned_concurrency_config hello {
  function_name                     = aws_lambda_function.hello.function_name
  provisioned_concurrent_executions = 1
  qualifier                         = aws_lambda_function.hello.version
}

実行すると、、

エラーになりました。

Error: error putting Lambda Provisioned Concurrency Config (lambda-provisioned-concurrency-sandbox-hello-world:$LATEST): InvalidParameterValueException: Provisioned Concurrency Configs cannot be applied to unpublished function versions.

これは、Provisioned ConcurrencyがLambdaの特定のバージョン、もしくはエイリアスに対して設定するものだからです。何もバージョン設定を行なっていなければ$LATESTというバージョンのみが表示されますが、$LATESTにはProvisioned Concurrencyを設定することはできません。

バージョニングを有効化したい場合はaws_lambda_functionpublish引数をtrueにする必要があります。 (公式リファレンスリンク )
8行目を追加しました。

  resource aws_lambda_function hello {
    filename         = local.lambda_zip_file_path
    function_name    = "${var.basename}-hello-world"
    role             = aws_iam_role.hello.arn
    handler          = "index.handler"
    source_code_hash = filebase64sha256(data.archive_file.lambda_src.output_path)
    runtime          = "nodejs12.x"
    publish          = true
  }

一度 terraform destroy してから再度作り直します。(terraform apply)

実行完了しました。aws_lambda_provisioned_concurrency_configリソース作成に3分ちょっとかかりました。結構時間かかりますね。

バージョンが作成されています。

Provisioned Concurrencyの設定ができました!

バージョン更新してみる

ちょっとNodeJSのコードを更新して新バージョンを作成してみましょう。バージョン1のProvisioned Concurrencyの設定は削除され、代わりにバージョン2のものが作成されるはずです。

結果

狙い通りバージョン2のものになりました。

エイリアス版

以下のように修正すればエイリアス版の設定もできます。

+ resource aws_lambda_alias hello_alias {
+   function_name    = aws_lambda_function.hello.function_name
+   function_version = aws_lambda_function.hello.version
+   name             = "my-hello-alias"
+ }

resource aws_lambda_provisioned_concurrency_config hello {
  function_name                     = aws_lambda_alias.hello_alias.function_name
  provisioned_concurrent_executions = 1
+   qualifier                         = aws_lambda_alias.hello_alias.name
-   qualifier                         = aws_lambda_function.hello.version
}

結果

狙い通りエイリアス版になりました!