anthos-multi-cloud/AWS/modules/iam/main.tf (310 lines of code) (raw):
/**
* Copyright 2022-2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
# Create Anthos Multi-Cloud API role
# https://cloud.google.com/anthos/clusters/docs/multi-cloud/aws/how-to/create-aws-iam-roles
data "aws_iam_policy_document" "api_assume_role_policy_document" {
statement {
effect = "Allow"
principals {
type = "Federated"
identifiers = ["accounts.google.com"]
}
actions = ["sts:AssumeRoleWithWebIdentity"]
condition {
test = "StringEquals"
variable = "accounts.google.com:sub"
values = [
"service-${var.gcp_project_number}@gcp-sa-gkemulticloud.iam.gserviceaccount.com"
]
}
}
}
resource "aws_iam_role" "api_role" {
name = "${var.anthos_prefix}-anthos-api-role"
description = "IAM role for OnePlatform service backend"
assume_role_policy = data.aws_iam_policy_document.api_assume_role_policy_document.json
}
data "aws_iam_policy_document" "api_policy_document" {
statement {
effect = "Allow"
actions = [
"autoscaling:CreateAutoScalingGroup",
"autoscaling:CreateOrUpdateTags",
"autoscaling:DeleteAutoScalingGroup",
"autoscaling:DeleteTags",
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:DisableMetricsCollection",
"autoscaling:EnableMetricsCollection",
"autoscaling:TerminateInstanceInAutoScalingGroup",
"autoscaling:UpdateAutoScalingGroup",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CreateLaunchTemplate",
"ec2:CreateNetworkInterface",
"ec2:CreateSecurityGroup",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:DeleteLaunchTemplate",
"ec2:DeleteNetworkInterface",
"ec2:DeleteSecurityGroup",
"ec2:DeleteTags",
"ec2:DeleteVolume",
"ec2:DescribeAccountAttributes",
"ec2:DescribeInstances",
"ec2:DescribeInternetGateways",
"ec2:DescribeKeyPairs",
"ec2:DescribeLaunchTemplates",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeSecurityGroupRules",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeVpcs",
"ec2:GetConsoleOutput",
"ec2:ModifyNetworkInterfaceAttribute",
"ec2:RevokeSecurityGroupEgress",
"ec2:RevokeSecurityGroupIngress",
"ec2:RunInstances",
"elasticloadbalancing:AddTags",
"elasticloadbalancing:CreateListener",
"elasticloadbalancing:CreateLoadBalancer",
"elasticloadbalancing:CreateTargetGroup",
"elasticloadbalancing:DeleteListener",
"elasticloadbalancing:DeleteLoadBalancer",
"elasticloadbalancing:DeleteTargetGroup",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeTargetHealth",
"elasticloadbalancing:ModifyTargetGroupAttributes",
"elasticloadbalancing:RemoveTags",
"iam:AWSServiceName",
"iam:CreateServiceLinkedRole",
"iam:GetInstanceProfile",
"iam:PassRole",
]
resources = ["*"]
}
statement {
effect = "Allow"
actions = [
"kms:DescribeKey",
]
resources = [
"arn:aws:kms:*:*:key/*",
]
}
statement {
effect = "Allow"
actions = [
"kms:Encrypt",
]
resources = [var.cp_config_kms_arn]
}
statement {
effect = "Allow"
actions = [
"kms:Encrypt",
]
resources = [var.np_config_kms_arn]
}
statement {
effect = "Allow"
actions = [
"kms:GenerateDataKeyWithoutPlaintext",
]
resources = [var.cp_main_volume_kms_arn]
}
}
resource "aws_iam_policy" "api_policy" {
name = "${var.anthos_prefix}-anthos-api-policy"
path = "/"
policy = data.aws_iam_policy_document.api_policy_document.json
}
# Step 3 in doc
resource "aws_iam_role_policy_attachment" "api_role_policy_attachment" {
role = aws_iam_role.api_role.name
policy_arn = aws_iam_policy.api_policy.arn
}
# Create the control plane role
# https://cloud.google.com/anthos/clusters/docs/multi-cloud/aws/how-to/create-aws-iam-roles#create_the_control_plane_role
data "aws_iam_policy_document" "cp_assume_role_policy_document" {
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
actions = ["sts:AssumeRole"]
}
}
resource "aws_iam_role" "cp_role" {
name = "${var.anthos_prefix}-anthos-cp-role"
description = "IAM role for the control plane"
assume_role_policy = data.aws_iam_policy_document.cp_assume_role_policy_document.json
}
data "aws_iam_policy_document" "cp_policy_document" {
statement {
effect = "Allow"
actions = [
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:DescribeAutoScalingInstances",
"autoscaling:DescribeLaunchConfigurations",
"autoscaling:DescribeTags",
"autoscaling:SetDesiredCapacity",
"autoscaling:TerminateInstanceInAutoScalingGroup",
"ec2:AttachNetworkInterface",
"ec2:AttachVolume",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CreateRoute",
"ec2:CreateSecurityGroup",
"ec2:CreateSnapshot",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:DeleteRoute",
"ec2:DeleteSecurityGroup",
"ec2:DeleteSnapshot",
"ec2:DeleteTags",
"ec2:DeleteVolume",
"ec2:DescribeAccountAttributes",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeDhcpOptions",
"ec2:DescribeInstances",
"ec2:DescribeInstanceTypes",
"ec2:DescribeInternetGateways",
"ec2:DescribeLaunchTemplateVersions",
"ec2:DescribeRegions",
"ec2:DescribeRouteTables",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSnapshots",
"ec2:DescribeSubnets",
"ec2:DescribeTags",
"ec2:DescribeVolumes",
"ec2:DescribeVolumesModifications",
"ec2:DescribeVpcs",
"ec2:DetachVolume",
"ec2:ModifyInstanceAttribute",
"ec2:ModifyVolume",
"ec2:RevokeSecurityGroupIngress",
"elasticloadbalancing:AddTags",
"elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
"elasticloadbalancing:AttachLoadBalancerToSubnets",
"elasticloadbalancing:ConfigureHealthCheck",
"elasticloadbalancing:CreateListener",
"elasticloadbalancing:CreateLoadBalancer",
"elasticloadbalancing:CreateLoadBalancerListeners",
"elasticloadbalancing:CreateLoadBalancerPolicy",
"elasticloadbalancing:CreateTargetGroup",
"elasticloadbalancing:DeleteListener",
"elasticloadbalancing:DeleteLoadBalancer",
"elasticloadbalancing:DeleteLoadBalancerListeners",
"elasticloadbalancing:DeleteTargetGroup",
"elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
"elasticloadbalancing:DeregisterTargets",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:DescribeLoadBalancerAttributes",
"elasticloadbalancing:DescribeLoadBalancerPolicies",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeTargetHealth",
"elasticloadbalancing:DetachLoadBalancerFromSubnets",
"elasticloadbalancing:ModifyListener",
"elasticloadbalancing:ModifyLoadBalancerAttributes",
"elasticloadbalancing:ModifyTargetGroup",
"elasticloadbalancing:RegisterInstancesWithLoadBalancer",
"elasticloadbalancing:RegisterTargets",
"elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer",
"elasticloadbalancing:SetLoadBalancerPoliciesOfListener",
"elasticfilesystem:CreateAccessPoint",
"elasticfilesystem:DeleteAccessPoint",
"elasticfilesystem:DescribeAccessPoints",
"elasticfilesystem:DescribeFileSystems",
"elasticfilesystem:DescribeMountTargets",
]
resources = ["*"]
}
statement {
effect = "Allow"
actions = [
"kms:Decrypt",
"kms:Encrypt",
]
resources = [var.db_kms_arn]
}
statement {
effect = "Allow"
actions = [
"kms:Decrypt",
]
resources = [var.cp_config_kms_arn]
}
statement {
effect = "Allow"
actions = [
"kms:CreateGrant",
]
resources = [var.cp_main_volume_kms_arn]
condition {
test = "Bool"
variable = "kms:GrantIsForAWSResource"
values = [true]
}
}
}
resource "aws_iam_policy" "cp_policy" {
name = "${var.anthos_prefix}-anthos-cp-policy"
path = "/"
policy = data.aws_iam_policy_document.cp_policy_document.json
}
resource "aws_iam_role_policy_attachment" "cp_role_policy_attachment" {
role = aws_iam_role.cp_role.name
policy_arn = aws_iam_policy.cp_policy.arn
}
# Step 4 & 5 in doc
resource "aws_iam_instance_profile" "cp_instance_profile" {
name = "${var.anthos_prefix}-anthos-cp-instance-profile"
role = aws_iam_role.cp_role.id
}
# Create the node pool role
# https://cloud.google.com/anthos/clusters/docs/multi-cloud/aws/how-to/create-aws-iam-roles#create_a_node_pool_iam_role
data "aws_iam_policy_document" "np_assume_role_policy_document" {
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
actions = ["sts:AssumeRole"]
}
}
resource "aws_iam_role" "np_role" {
name = "${var.anthos_prefix}-anthos-np-role"
description = "IAM role for the node pool"
assume_role_policy = data.aws_iam_policy_document.np_assume_role_policy_document.json
}
data "aws_iam_policy_document" "np_policy_document" {
statement {
effect = "Allow"
actions = [
"kms:Decrypt",
]
resources = [var.np_config_kms_arn]
}
}
resource "aws_iam_policy" "np_policy" {
name = "${var.anthos_prefix}-anthos-np-policy"
path = "/"
policy = data.aws_iam_policy_document.np_policy_document.json
}
resource "aws_iam_role_policy_attachment" "np_role_policy_attachment" {
role = aws_iam_role.np_role.name
policy_arn = aws_iam_policy.np_policy.arn
}
resource "aws_iam_instance_profile" "np_instance_profile" {
name = "${var.anthos_prefix}-anthos-np-instance-profile"
role = aws_iam_role.np_role.id
}