infra/modules/iam/main.tf (220 lines of code) (raw):
resource "aws_iam_role" "ec2_instance_role" {
assume_role_policy = <<EOT
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOT
name = "${var.project_name}-${var.stack_name}-ec2InstanceRole"
}
resource "aws_iam_role_policy_attachment" "instance_role" {
role = "${aws_iam_role.ec2_instance_role.name}"
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role"
}
resource "aws_iam_instance_profile" "instance_profile" {
name = "${var.project_name}-${var.stack_name}-ec2InstanceProfile"
role = "${aws_iam_role.ec2_instance_role.name}"
}
# IAM TeamCity ECS User
resource "aws_iam_policy" "server" {
name = "${var.project_name}-${var.stack_name}-server"
path = "/"
description = "Policy for ${var.project_name}-${var.stack_name}"
policy = <<EOT
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ecs:RegisterTaskDefinition",
"ecs:ListClusters",
"ecs:DescribeContainerInstances",
"ecs:ListTaskDefinitions",
"ecs:ListTasks",
"ecs:DescribeTaskDefinition",
"cloudwatch:GetMetricStatistics"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Action": [
"ecs:DescribeClusters",
"ecs:StopTask",
"ecs:ListContainerInstances"
],
"Effect": "Allow",
"Resource": "arn:aws:ecs:${var.aws_region}:*:cluster/${var.project_name}-${var.stack_name}"
},
{
"Action": [
"ecs:RunTask"
],
"Effect": "Allow",
"Resource": [
"arn:aws:ecs:${var.aws_region}:*:task-definition/${var.project_name}-agent-${var.stack_name}:*"
]
},
{
"Action": [
"ecs:StopTask",
"ecs:DescribeTasks"
],
"Effect": "Allow",
"Resource": "arn:aws:ecs:${var.aws_region}:*:task/*"
}
]
}
EOT
}
resource "aws_iam_user" "server" {
name = "${var.project_name}-${var.stack_name}-server"
}
resource "aws_iam_user_policy_attachment" "server-ecs" {
policy_arn = "${aws_iam_policy.server.arn}"
user = "${aws_iam_user.server.name}"
}
resource "aws_iam_access_key" "server" {
user = "${aws_iam_user.server.name}"
}
resource "aws_iam_role" "sns-lambda" {
assume_role_policy = <<EOT
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "autoscaling.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOT
name = "${var.project_name}-${var.stack_name}-sns-lambda"
}
resource "aws_iam_role_policy" "sns-lambda" {
name = "${var.project_name}-${var.stack_name}-sns-lambda"
role = "${aws_iam_role.sns-lambda.id}"
policy = <<EOT
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sqs:SendMessage",
"sqs:GetQueueUrl",
"sns:Publish"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
EOT
}
resource "aws_iam_role" "lambda-ecs-asg" {
name = "${var.project_name}-${var.stack_name}-lambda-ecs-asg"
assume_role_policy = <<EOT
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOT
}
resource "aws_iam_role_policy" "lambda-ecs-asg" {
name = "${var.project_name}-${var.stack_name}-ecs-asg"
role = "${aws_iam_role.lambda-ecs-asg.id}"
policy = <<EOT
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"autoscaling:CompleteLifecycleAction",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ec2:DescribeInstances",
"ec2:DescribeInstanceAttribute",
"ec2:DescribeInstanceStatus",
"ec2:DescribeHosts",
"ecs:ListContainerInstances",
"ecs:SubmitContainerStateChange",
"ecs:SubmitTaskStateChange",
"ecs:DescribeContainerInstances",
"ecs:UpdateContainerInstancesState",
"ecs:ListTasks",
"ecs:DescribeTasks",
"sns:Publish",
"sns:ListSubscriptions"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
EOT
}
resource "aws_iam_role" "lambda-ecs-unprotect-asg" {
name = "${var.project_name}-${var.stack_name}-lambda-ecs-unprotect-asg"
assume_role_policy = <<EOT
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOT
}
resource "aws_iam_role_policy" "lambda-ecs-unprotect-asg" {
name = "${var.project_name}-${var.stack_name}-ecs-unprotect-asg"
role = "${aws_iam_role.lambda-ecs-unprotect-asg.id}"
policy = <<EOT
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"autoscaling:SetInstanceProtection",
"autoscaling:DescribeAutoScalingInstances",
"ecs:ListContainerInstances",
"ecs:DescribeContainerInstances",
"ecs:UpdateContainerInstancesState"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
EOT
}