TerraformでAWSの環境構築 ( IAM-Role/Policy )
やったこと
Terraformを利用してAWS環境のIAMロールを作成する。
- IAM-Role
- lambda-functionに付与するロール
信頼されたエンティティ(ID プロバイダー lambda.amazonaws.com)
labmda-basic-execution
ポリシーを作成- IAMロールを作成し、そのロールに対して作成ポリシーを同時にアタッチ
- IAMポリシー単体で作成
- lambda-functionに付与するロール
実行環境
$ terraform --version
Terraform v0.12.0 + provider.aws v2.13.0
IAMロールを作成する
- IAMロールに付与するために、信頼されたエンティティ(ID プロバイダー lambda.amazonaws.com)を設定する
IAMポリシーを作成してIAMロールをアタッチする
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 }
↓↓↓
■ 結果
■ "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" }
↓↓↓
■ 結果
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から行った。