Amazon web services Terraform和AWS:修改现有策略

Amazon web services Terraform和AWS:修改现有策略,amazon-web-services,terraform,amazon-iam,terraform-provider-aws,aws-secrets-manager,Amazon Web Services,Terraform,Amazon Iam,Terraform Provider Aws,Aws Secrets Manager,我已将现有IAM策略附加到某个角色。每次在机密管理器中创建新机密时,我都需要将新ARN附加到策略中。这可以用Terraform完成吗?我已成功将策略导入terraform.state文件,但我不知道如何: 1) 在“资源”列表中追加新的ARN 2) 将更改推到AWS 现在的政策是这样的: { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmana

我已将现有IAM策略附加到某个角色。每次在机密管理器中创建新机密时,我都需要将新ARN附加到策略中。这可以用Terraform完成吗?我已成功将策略导入terraform.state文件,但我不知道如何: 1) 在“资源”列表中追加新的ARN 2) 将更改推到AWS

现在的政策是这样的:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": "secretsmanager:GetSecretValue",
        "Resource": [
            "SECRET_ARN_1",
            "SECRET_ARN_2",
            "SECRET_ARN_3"
        ]
    },
    {
        "Effect": "Allow",
        "Action": "kms:Decrypt",
        "Resource": "KMS_ARN"
    }
]
}

这就是我需要它的样子:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": "secretsmanager:GetSecretValue",
        "Resource": [
            "SECRET_ARN_1",
            "SECRET_ARN_2",
            "SECRET_ARN_3",
            "MY_BRAND_NEW_SECRET_ARN"
        ]
    },
    {
        "Effect": "Allow",
        "Action": "kms:Decrypt",
        "Resource": "KMS_ARN"
    }
]
}

下面的导入是通过将现有策略导入对象aws_iam_policy.mysimplepolicy来实现的,但我不知道如何从这里开始

terraform import aws_iam_policy.mysimplepolicy <MY_POLICY_ARN>
terraform导入aws\u iam\u策略.mysimplepolicy

听起来您已经知道如何将策略导入到您所在的州。现在,您需要在地形代码中定义资源,使其与策略匹配

首先,定义ARN的变量:

variable "secret_arns" {
    description = "A list of secret manager ARNs that the IAM policy should permit access to."
    type        = list(string)
}

variable "kms_key_arns" {
    description = "A list of KMS Key ARNs that the IAM policy should permit access to."
    type        = list(string)
}
接下来,使用以下变量将策略文档定义为数据源:

data "aws_iam_policy_document" "secret_access" {
    statement {
        sid       = "SecretsAccess"
        actions   = ["secretsmanager:GetSecretValue"]
        resources = var.secret_arns
        effect    = "Allow"
    }
    statement {
        sid       = "KMSAccess"
        actions   = "kms:Decrypt"
        resources = var.kms_key_arns
        effect    = "Allow"
    }
}
现在使用数据源创建策略:

resource "aws_iam_policy" "mysimplepolicy" {
  name   = "MySimplePolicy"  # Make sure this has the name you want
  policy = data.aws_iam_policy_document.secret_access.json
}
最后,在调用代码时,使用您喜欢的任何方法在变量中传递ARN。它可以来自
terraform.tfvars
文件,或者在命令行上使用
-var
语法,或者作为创建机密的另一个terraform模块的输出。例如:

terraform apply -var='secret_arns=["arn1", "arn2", <etc>]' -var='kms_key_arns=["key-arn1", "key-arn2"]'
terraform apply-var='secret\u arns=[“arn1”、“arn2”、]'-var='kms\u key\u arns=[“key-arn1”、“key-arn2”]

每次您将一个新项目附加到其中一个变量并运行
terraform apply
,terraform将相应地更新策略。

另一个可能更简单的选项是使用基于标记的授权。也就是说,修改策略以仅授予对具有特定标记的机密的访问权限,然后在创建机密时添加该标记。还有很多方法可用于此操作。

谢谢!这澄清了很多问题,解决了80%的问题。您知道有没有办法检索现有的机密ARN列表,并附加新的一个,而不是再次键入所有的ARN?在这一点上,我有一个8长ARN列表,这将是一个痛苦的未来。再次感谢。很高兴它起了作用!如果答案对你有效,请投票和/或接受。至于检索现有机密,您可以使用
aws\u secretsmanager\u secret
数据源动态检索机密。见: