My Note

自己理解のためのブログ

TerraformでAWSの環境構築 ( IAM-Role/Policy )

やったこと

Terraformを利用してAWS環境のIAMロールを作成する。

  • IAM-Role
    • lambda-functionに付与するロール
      • 信頼されたエンティティ(ID プロバイダー lambda.amazonaws.com)
    • labmda-basic-executionポリシーを作成
    • IAMロールを作成し、そのロールに対して作成ポリシーを同時にアタッチ
    • IAMポリシー単体で作成

実行環境

  • $ terraform --version
Terraform v0.12.0
+ provider.aws v2.13.0

IAMロールを作成する

  1. IAMロールに付与するために、信頼されたエンティティ(ID プロバイダー lambda.amazonaws.com)を設定する
  2. IAMポリシーを作成してIAMロールをアタッチする

  3. Terraform公式ドキュメント

■ "aws_iam_role" "lambda_role"の全体

IAMロールに付与するために、信頼されたエンティティ(ID プロバイダー lambda.amazonaws.com)を設定する

// Lambda用ロール
resource "aws_iam_role" "lambda_role" {
  name               = "${var.name}"
  assume_role_policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Effect": "Allow",
            "Sid": ""
        }
    ]
}
EOF
}

↓↓↓

■ 結果

f:id:yhidetoshi:20190621233355p:plain

■ "aws_iam_role_policy" "iam_for_lambda"の全体

IAMポリシーを作成してIAMロールをアタッチする

resource "aws_iam_role_policy" "iam_for_lambda" {
  name = "${var.name}"
  role = "${aws_iam_role.lambda_role.id}"

  policy = <<EOF
${file("${var.policy_json}")}
EOF
}
  • ./external/iam/iam_role_labmda-basic-execution.json
{
    "Statement": [
        {
            "Action": [
                "codepipeline:GetPipeline",
                "codepipeline:GetPipelineState",
                "codepipeline:GetPipelineExecution",
                "codepipeline:ListPipelineExecutions",
                "codepipeline:ListActionTypes",
                "codepipeline:ListPipelines",
                "ssm:GetParameter"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*",
            "Effect": "Allow"
        }
    ],
    "Version": "2012-10-17"
}

↓↓↓

■ 結果

f:id:yhidetoshi:20190621233419p:plain

Terraformのコード全体

ディレクトリ構造(一部抜粋)

├── external
│   ├── iam
│   │   ├── iam_policy_ModifyEc2Tag.json
│   │   └── iam_role_labmda-basic-execution.json
├── iam_policy.tf
├── iam_role.tf
├── lambda.tf
├── modules
│   ├── iam
│   │   ├── policy
│   │   │   └── main.tf
│   │   └── role
│   │       └── main.tf

jsonファイル(external/iam/iam_role_labmda-basic-execution.json)

{
    "Statement": [
        {
            "Action": [
                "codepipeline:GetPipeline",
                "codepipeline:GetPipelineState",
                "codepipeline:GetPipelineExecution",
                "codepipeline:ListPipelineExecutions",
                "codepipeline:ListActionTypes",
                "codepipeline:ListPipelines",
                "ssm:GetParameter"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*",
            "Effect": "Allow"
        }
    ],
    "Version": "2012-10-17"
}

■ Resource側(modules/iam/role/main.tf)

variable "name" {}

variable "policy_json" {
  default = "policy.json"
}



// Lambda用ロール
resource "aws_iam_role" "lambda_role" {
  name               = "${var.name}"
  assume_role_policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Effect": "Allow",
            "Sid": ""
        }
    ]
}
EOF
}

resource "aws_iam_role_policy" "iam_for_lambda" {
  name = "${var.name}"
  role = "${aws_iam_role.lambda_role.id}"

  policy = <<EOF
${file("${var.policy_json}")}
EOF
}

■ Module側 (iam_role.tf)

module "create_iam-role-labmda-basic-execution" {
  source      = "./modules/iam/role/"
  name        = "lambda-basic-execution"
  policy_json = "./external/iam/iam_role_labmda-basic-execution.json"
}

追加 (IAMポリシーの作成) コード全体

jsonファイル(external/iam/iam_policy_ModifyEc2Tag.json)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Idsample",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteTags"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

■ Resource側 (modules/iam/policy/main.tf)

variable "name" {}
variable "path" {}
variable "description" {}

variable "policy_json" {
  default = "policy.json"
}


resource "aws_iam_policy" "iam_policy" {
  name        = "${var.name}"
  path        = "${var.path}"
  description = "${var.description}"

  policy = <<EOF
${file("${var.policy_json}")}
EOF
}

■ Module側 (iam_policy.tf)

module "iam-policy-modify-ec2-tag" {
  source      = "./modules/iam/policy/"
  name        = "ModifyEc2Tag"
  path        = "/policy/"
  description = "modify ec2 tag"
  policy_json = "./external/iam/iam_policy_ModifyEc2Tag.json"
}

まとめ

IAMロールを信頼関係を付与し、ポリシー作成とアタッチを行った。また、ポリシー単体での作成をTerraformから行った。