【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の定期実行を行う場合は、以下の設定が必要です。
こちら