lulu

【AWS lambda】lambdaの実行ログをcloudwatch logsに保存する方法をTerraformで解説する

やること

lambdaの実行ログをcloudwatch logsに貯める構築をTerraformにて行う

前提

こちら にて作成したterraformのファイルとindex.jsを元に解説します。(ようは続きです)

ファイル構成

↑の記事の通り、terraformでlambda関数を作成していた場合、以下のようなディレクトリ構成になっています(.terraformやtfstateは割愛)

$ tree .
.
├── index.js
├── node_modules
├── lambda.zip
├── main.tf
└── package.lock.json

そして、Terraformのソースを記載するmain.tfは以下のようになっています。

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

resource "aws_iam_role" "iam_for_lambda" {
  name = "iam_for_lambda_afasdasdf"

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

resource "aws_lambda_function" "test_lambda" {
  filename      = "lambda.zip"
  function_name = "lambda_function_name"
  role          = aws_iam_role.iam_for_lambda.arn
  handler       = "index.handler"
  source_code_hash = filebase64sha256("lambda.zip")
  runtime = "nodejs14.x"

  timeout = 30
}

今回はこのファイルにcloudwatch log用の記述を追記していきます。

cloudwatch logの追記

cloudwatch_log_groupを作成するためのresourceを追加

resource "aws_cloudwatch_log_group" "example" {
  name              = "/aws/lambda/lambda_function_name"
  retention_in_days = 14
}

lambdaからcloudwatch logsに書き込み権限を付与するために、iam roleに新規policyをアタッチします。

resource "aws_iam_role_policy_attachment" "lambda_logs" {
  role       = aws_iam_role.iam_for_lambda.name
  policy_arn = aws_iam_policy.lambda_logging.arn
}

resource "aws_iam_policy" "lambda_logging" {
  name        = "lambda_logging"
  path        = "/"
  description = "IAM policy for logging from a lambda"

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*",
      "Effect": "Allow"
    }
  ]
}
EOF
}

terraform apply

これで準備が整いました。
説明どおりにファイル修正が進んだ場合、main.tfファイルは以下のようになっているかと思います。

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

resource "aws_iam_role" "iam_for_lambda" {
  name = "iam_for_lambda_afasdasdf"

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

resource "aws_lambda_function" "test_lambda" {
  filename      = "lambda.zip"
  function_name = "lambda_function_name"
  role          = aws_iam_role.iam_for_lambda.arn
  handler       = "index.handler"
  source_code_hash = filebase64sha256("lambda.zip")
  runtime = "nodejs14.x"

  timeout = 30
}

resource "aws_cloudwatch_log_group" "example" {
  name              = "/aws/lambda/lambda_function_name"
  retention_in_days = 14
}

resource "aws_iam_role_policy_attachment" "lambda_logs" {
  role       = aws_iam_role.iam_for_lambda.name
  policy_arn = aws_iam_policy.lambda_logging.arn
}

resource "aws_iam_policy" "lambda_logging" {
  name        = "lambda_logging"
  path        = "/"
  description = "IAM policy for logging from a lambda"

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*",
      "Effect": "Allow"
    }
  ]
}
EOF
}

この状態で、

$ terraform apply

を実行すると、AWSに反映されて、lambdaの実行ごとにcloudwatch logsにlogがたまるようになります!

定期実行について

lambdaの定期実行を行う場合は、以下の設定が必要です。
こちら