modules/accelerator/iam-policies/policies.tf (221 lines of code) (raw):

#================= AWS CodePipeline Policies ===============================# data "aws_iam_policy_document" "codepipeline_assume_policy" { statement { effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["codepipeline.amazonaws.com"] } principals { identifiers = ["arn:aws:iam::${var.aws_account_id}:root"] type = "AWS" } } } resource "aws_iam_role" "codepipeline_role" { name_prefix = "Codepipeline-${var.repo_name}-${var.region_name}-" assume_role_policy = data.aws_iam_policy_document.codepipeline_assume_policy.json } # CodePipeline policy needed to use CodeCommit and CodeBuild data "template_file" "codepipeline_policy_template" { template = file("${path.module}/iam-policies/codepipeline.tpl") vars = { AwsKmsKey = var.aws_kms_key_arn ArtifactBucket = var.build_artifact_bucket_arn Project = var.project CodestarConnection = "${var.connection_provider}-${var.region_name}-${var.repo_name}" DeploymentGroup = "${var.repo_name}-${var.region_name}" Application = "${var.repo_name}-${var.region_name}" Region = var.region Account = var.aws_account_id RepoName = var.repo_name } } resource "aws_iam_policy" "codepipeline_policy" { name_prefix = "Codepipeline-policy-${var.repo_name}-${var.region_name}-" policy = data.template_file.codepipeline_policy_template.rendered } resource "aws_iam_role_policy_attachment" "codepipeline_policy" { role = aws_iam_role.codepipeline_role.name policy_arn = aws_iam_policy.codepipeline_policy.arn } # CodeBuild IAM Permissions data "aws_iam_policy_document" "codebuild_assume_policy" { statement { effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["codebuild.amazonaws.com"] } principals { identifiers = ["arn:aws:iam::${var.aws_account_id}:root"] type = "AWS" } } } resource "aws_iam_role" "codebuild_role" { name_prefix = "Codebuild-${var.repo_name}-${var.region_name}-" assume_role_policy = data.aws_iam_policy_document.codebuild_assume_policy.json } resource "aws_iam_policy" "codebuild_policy_vpc" { name_prefix = "Policy-vpc-${var.repo_name}-${var.region_name}-" policy = <<POLICY { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DescribeDhcpOptions", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "ec2:DescribeVpcs" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterfacePermission" ], "Resource": "arn:aws:ec2:${var.region}:${var.aws_account_id}:network-interface/*", "Condition": { "StringEquals": { "ec2:Subnet": [ "arn:aws:ec2:${var.region}:${var.aws_account_id}:subnet/${var.private_subnet_ids[0]}", "arn:aws:ec2:${var.region}:${var.aws_account_id}:subnet/${var.private_subnet_ids[1]}", "arn:aws:ec2:${var.region}:${var.aws_account_id}:subnet/${var.private_subnet_ids[2]}" ], "ec2:AuthorizedService": "codebuild.amazonaws.com" } } } ] } POLICY } resource "aws_iam_role_policy_attachment" "policy-attach-vpc" { role = aws_iam_role.codebuild_role.name policy_arn = aws_iam_policy.codebuild_policy_vpc.arn } data "template_file" "codebuild_policy_template" { template = file("${path.module}/iam-policies/codebuild.tpl") vars = { ArtifactBucket = var.build_artifact_bucket_arn StorageBucket = var.storage_bucket_arn AwsKmsKey = var.aws_kms_key_arn Region = var.region Account = var.aws_account_id Project = var.project RepoName = var.repo_name ECR = "${var.repo_name}-${var.region_name}" } } resource "aws_iam_policy" "codebuild_policies" { name_prefix = "Codebuild-policy-${var.repo_name}-${var.region_name}-" policy = data.template_file.codebuild_policy_template.rendered } resource "aws_iam_role_policy_attachment" "codebuild_policies" { role = aws_iam_role.codebuild_role.name policy_arn = aws_iam_policy.codebuild_policies.arn } resource "aws_iam_role_policy_attachment" "dlt" { role = aws_iam_role.codebuild_role.name policy_arn = "arn:aws:iam::aws:policy/AmazonCognitoReadOnly" } #================================== AWS Codedeploy policies ========================# data "aws_iam_policy_document" "codedeploy_assume_policy" { statement { effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["codedeploy.${var.region}.amazonaws.com"] } } } resource "aws_iam_role" "codedeploy_role" { count = var.target_type == "ip" || var.target_type == "instance" ? 1 : 0 name_prefix = "Codedeploy-${var.repo_name}-${var.region_name}-" assume_role_policy = data.aws_iam_policy_document.codedeploy_assume_policy.json } data "template_file" "codedeploy_policy_template" { template = file("${path.module}/iam-policies/codedeploy.tpl") vars = { AwsKmsKey = var.aws_kms_key_arn ArtifactBucket = var.build_artifact_bucket_arn StorageBucket = var.storage_bucket_arn Region = var.region Account = var.aws_account_id } } resource "aws_iam_policy" "codedeploy_policies" { count = var.target_type == "ip" || var.target_type == "instance" ? 1 : 0 name_prefix = "Codedeploy-policy-${var.repo_name}-${var.region_name}-" policy = data.template_file.codedeploy_policy_template.rendered } resource "aws_iam_role_policy_attachment" "codedeploy_policies" { count = var.target_type == "ip" || var.target_type == "instance" ? 1 : 0 role = aws_iam_role.codedeploy_role[0].name policy_arn = aws_iam_policy.codedeploy_policies[0].arn } resource "aws_iam_role_policy_attachment" "codedeploy_ecs" { count = var.target_type == "ip" ? 1 : 0 role = aws_iam_role.codedeploy_role[0].name policy_arn = "arn:aws:iam::aws:policy/AWSCodeDeployRoleForECS" } resource "aws_iam_role_policy_attachment" "codedeploy_ec2" { count = var.target_type == "instance" ? 1 : 0 role = aws_iam_role.codedeploy_role[0].name policy_arn = "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole" } #============================= ECS Policies ===========================## data "aws_iam_policy_document" "ecs_assume_policy" { statement { effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["ecs-tasks.amazonaws.com"] } } } resource "aws_iam_role" "ecs_execution_role" { count = var.target_type == "ip" ? 1 : 0 name_prefix = "Ecs-Execution-${var.region_name}-${var.repo_name}-" assume_role_policy = data.aws_iam_policy_document.ecs_assume_policy.json } resource "aws_iam_role_policy_attachment" "ecs_execution" { count = var.target_type == "ip" ? 1 : 0 role = aws_iam_role.ecs_execution_role[0].name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" } resource "aws_iam_role" "ecs_task_role" { count = var.target_type == "ip" ? 1 : 0 name_prefix = "Ecs-Task-${var.region_name}-${var.repo_name}-" assume_role_policy = data.aws_iam_policy_document.ecs_assume_policy.json } #============ Put Policies for Task Role here, if you need to get access to AWS Service ==========# ##======================== Policy for EKS ===============================## resource "aws_iam_policy" "eks" { count = var.target_type == "eks" ? 1 : 0 name = "EKS-${var.repo_name}-${var.region_name}" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = ["sts:AssumeRole"] Effect = "Allow" Resource = "${var.eks_role_arn}" }, { Action = ["eks:Describe*"] Effect = "Allow" Resource = "*" } ] }) } resource "aws_iam_role_policy_attachment" "eks" { count = var.target_type == "eks" ? 1 : 0 role = aws_iam_role.codebuild_role.name policy_arn = aws_iam_policy.eks[0].arn }