Closed7
【terraform】モジュールでの条件分岐を考える
題材はLambda
ディレクトリ階層
.
├── main.tf
├── modules
├── each-module
├── lambda.tf
└── variables.tf
lambda.tf
### IAMロール
resource "aws_iam_role" "lambda" {
name = "${var.function}-iam-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = {
Effect = "Allow"
Action = "sts:AssumeRole"
Principal = {
Service = "lambda.amazonaws.com"
}
}
})
}
resource "aws_iam_role_policy" "lambda" {
name = "${var.function}-iam-policy"
role = aws_iam_role.lambda.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
]
Resource = [
aws_cloudwatch_log_group.lambda.arn,
"${aws_cloudwatch_log_group.lambda.arn}:*"
]
}
]
})
}
### cloudwatch logs
resource "aws_cloudwatch_log_group" "lambda" {
name = "/aws/lambda/${aws_lambda_function.lambda.function_name}"
retention_in_days = 30
}
### lambda
resource "aws_lambda_function" "lambda" {
function_name = var.function
memory_size = 128
package_type = "Image"
image_uri = var.image_uri
role = aws_iam_role.lambda.arn
}
main.tf
module "each-module" {
for_each = toset(["test1", "test2", "test3"])
function = each.key
source = "./modules/each-module"
env = var.env
image_uri = var.image_uri
}
デプロイすると
$ aws lambda list-functions | jq -r ".Functions[].FunctionName" | grep test | sort
test1
test2
test3
Lambda関数が3つできる
test1だけメモリサイズを256にする
lambda.tf
lambda.tf
resource "aws_lambda_function" "lambda" {
function_name = var.function
+ memory_size = var.memory_size
package_type = "Image"
image_uri = var.image_uri
role = aws_iam_role.lambda.arn
}
main.tf
module "each-module" {
for_each = toset(["test1", "test2", "test3"])
function = each.key
+ memory_size = each.key == "test1" ? 256 : 128
source = "./modules/each-module"
env = var.env
image_uri = var.image_uri
}
すると
$ aws lambda list-functions --query 'Functions[*].[FunctionName, MemorySize]' --output table
--------------------------
| ListFunctions |
+----------------+-------+
| test2 | 128 |
| test1 | 256 |
| test3 | 128 |
+----------------+-------+
と問題なく実現できた
三項演算子を使っている。
次は
- test1:256
- test2:128
- test3:512
とすることを目指す
①モジュールを再利用する
test1,2,3でそれぞれ同じモジュールを使う。シンプル
module "test1" {
function = "test1"
memory_size = 256
source = "./modules/each-module"
env = var.env
image_uri = var.image_uri
}
module "test2" {
function = "test2"
memory_size = 128
source = "./modules/each-module"
env = var.env
image_uri = var.image_uri
}
module "test3" {
function = "test3"
memory_size = 512
source = "./modules/each-module"
env = var.env
image_uri = var.image_uri
}
terraform init -upgrade
なりでモジュールを読み込む必要がある
また既存のモジュールを一度削除する必要あり?tfstateいじってなんとかなる?調査が必要
②lookupで環境毎にメモリ数を取得
lookup
関数を使うことで複数環境に対応出来ます。
locals {
lambda_memory = {
test1 = {
memory_size = 256
}
test2 = {
memory_size = 128
}
test3 = {
memory_size = 512
}
}
}
module "each-module" {
for_each = toset(["test1", "test2", "test3"])
function = each.key
memory_size = lookup(local.lambda_memory, each.key, {
memory_size = 128
}).memory_size
source = "./modules/each-module"
env = var.env
image_uri = var.image_uri
}
lookupはマップのキーを指定することでその値を利用することができる関数です
満足したのでクローズ
このスクラップは2023/12/01にクローズされました