0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Terraform初心者のための、ロールにポリシーを付与する基本の『基』

0
Last updated at Posted at 2026-05-20

1. はじめに

この記事でわかること

  • IAMロールとIAMポリシーの関係
  • Terraformでの基本的な実装方法

2. IAMロールとIAMポリシーの関係

IAMには主に2種類ある

  • 人間用(この人は、このサービスの、閲覧だけできる。あの人は、このサービスの閲覧も実行もできる)
  • AWSサービス用👈今回こっちがメイン
    (このサービスは他のサービスに対して読み込み、実行することができる)

そのAWSサービス用のIAMとは

AWSのどのサービスが、他のサービスに対して何ができるのかを管理している。

  • "EC2" が "CloudWatch Logs" に対して "ロググループを作成し、ログの書き込み" ができることを管理している。
  • "Step Functions" が "Lambda" に対して "実行(Invoke)" できるようにする。
    などなど。

ロールとポリシーの関係

サービスごとに「何をしてよいか」を権限として管理している。
image.png

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
}

関係図

image.png

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のリソースを作成する際には必ずついて回ってくるもの。基礎を理解しておけばロール、ポリシーの付与に関してはそこまで難しくはないと思います。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?