1. はじめに
この記事でわかること
- IAMロールとIAMポリシーの関係
- Terraformでの基本的な実装方法
2. IAMロールとIAMポリシーの関係
IAMには主に2種類ある
- 人間用(この人は、このサービスの、閲覧だけできる。あの人は、このサービスの閲覧も実行もできる)
- AWSサービス用👈今回こっちがメイン
(このサービスは他のサービスに対して読み込み、実行することができる)
そのAWSサービス用のIAMとは
AWSのどのサービスが、他のサービスに対して何ができるのかを管理している。
- "EC2" が "CloudWatch Logs" に対して "ロググループを作成し、ログの書き込み" ができることを管理している。
- "Step Functions" が "Lambda" に対して "実行(Invoke)" できるようにする。
などなど。
ロールとポリシーの関係
2. TerraformでIAMロールとIAMポリシーの付与
ロールとポリシーの概念が理解できたところで、じゃあTerraformではどう実装していくのかを説明していきます。
今回は簡単に、既存Lambdaの実行ログをCloudWatchへ書き込みできるよう既存ロールにポリシーを付与していくよ。
登場人物
①lambda_function.tf(既存lambda)
resource "aws_lambda_function" "fogefoge_lambda" {
function_name = "${terraform.workspace}-fogefoge_lambda"
# ↓このロール(権限まとめ)がfogefoge_lambdaにくっついているよ
role = aws_iam_role.fogefoge_lambda.arn
handler = "sample.lambda_handler"
s3_bucket = aws_s3_bucket.fogefoge_lambda.bucket
s3_key = "fogefoge_lambda.zip"
runtime = "python3.13"
memory_size = 128
timeout = 600
environment {
variables = {
ENV : terraform.workspace
}
}
}
②iam_role.tf(既存ロール)
# fogefoge_lambdaにくっついているロール
resource "aws_iam_role" "fogefoge_lambda" {
name = "${terraform.workspace}_fogefoge_lambda"
# ↓は③で説明
assume_role_policy = file("assume_role/lambda.json")
description = "fogefoge_lambda付与Role"
}
③assume_role_policy(assume_role/lambda.json)
IAMロールは、作成しただけでは誰も使えません。
どのサービスがこのIAMロールを利用してよいかをここで設定している。
{
"Version": "2012-10-17",
"Statement": [
{
// ロール使用許可設定
"Action": "sts:AssumeRole",
"Principal": {
// ↓このRoleを使っていいサービスはLambdaだよ、という設定
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
④iam_policy.tf(新規追加)
ポリシー追加ではここから追記していくよ
resource "aws_iam_policy" "fogefoge_lambda_create_log" {
# ポリシーの名前を決めよう
name = "${terraform.workspace}-fogefoge-lambda-create-log"
# どんなことができるかの詳細はここに書いていくよ
policy = data.aws_iam_policy_document.fogefoge_lambda_create_log.json
}
⑤iam_policy_document.tf
data "aws_iam_policy_document" "fogefoge_lambda_create_log" {
statement {
# 許可 or 拒否
# Allow = 許可
effect = "Allow"
actions = [
#こんなことができるよ
"logs:CreateLogGroup", #ロググループ作成
"logs:CreateLogStream", #ログストリーム作成
"logs:PutLogEvents" # ログ書き込み
]
resources = ["arn:aws:logs:*:*:*"]
}
}
⑥iam_role_policy_attachment.tf
ロールとポリシーの紐付け設定
resource "aws_iam_role_policy_attachment" "fogefoge_lambda_role_policy" {
# このロールに
role = aws_iam_role.fogefoge_lambda.name
# このポリシーを紐づけるよ
policy_arn = aws_iam_policy.fogefoge_lambda_create_log.arn
}
関係図
Terraform Plan結果(参考)
# aws_iam_policy.fogefoge_lambda_create_log will be created
+ resource "aws_iam_policy" "fogefoge_lambda_create_log" {
+ arn = (known after apply)
+ attachment_count = (known after apply)
+ id = (known after apply)
+ name = "prod-fogefoge-lambda-create-log"
+ name_prefix = (known after apply)
+ policy = jsonencode(
{
+ Statement = [
+ {
+ Action = [
+ "logs:PutLogEvents",
+ "logs:CreateLogStream",
+ "logs:CreateLogGroup",
]
+ Effect = "Allow"
+ Resource = "arn:aws:logs:*:*:*"
},
]
+ Version = "2012-10-17"
}
)
}
# aws_iam_role_policy_attachment.fogefoge_lambda_role_policy will be created
+ resource "aws_iam_role_policy_attachment" "fogefoge_lambda_role_policy" {
+ id = (known after apply)
+ policy_arn = (known after apply)
+ role = "prod__fogefoge_lambda"
}
AWSコンソールでは簡単にロール、ポリシーの付与って簡単ですがTerraformで反映させるのは意外と大変でしたね。
ただ、ロール、ポリシーの付与って1つのAWSのリソースを作成する際には必ずついて回ってくるもの。基礎を理解しておけばロール、ポリシーの付与に関してはそこまで難しくはないと思います。

