【问题标题】:How can I write a YAML Join Format of AWS Cloudformation to Terraform format?如何将 AWS Cloudformation 的 YAML 连接格式写入 Terraform 格式?
【发布时间】:2022-07-24 18:30:19
【问题描述】:

我正在尝试将 AWS Cloudformation 托管策略文档转换为 Terraform 文件以创建策略。但是,我遇到了Join format under the Resource section 的问题,即使我尝试用 \", \' 包装它或尝试将其转换为 JSON,Terraform 似乎也不接受它。我可以寻求一些帮助吗?我按照 terraform 正确解释它的方式对其进行格式化?下面是我正在处理的 terraform 文件。提前非常感谢。

module \"my_policy\" {
  source = \"../modules/policy\"

  policy = {
    name        = \"my_access\"
    description = \"my access account\"
    path        = \"/\"
    document    = <<EOF
{
  \"Version\": \"2012-10-17\",
  \"Statement\": [
    {
      \"Sid\": \"MyBeanstalkPermissions\",
      \"Effect\": \"Allow\",
      \"Action\": [
        \"elasticbeanstalk:CreateApplicationVersion\",
        \"elasticbeanstalk:DeleteApplicationVersion\",
        \"elasticbeanstalk:UpdateEnvironment\",
        \"elasticbeanstalk:CreateStorageLocation\",
        \"elasticbeanstalk:Check*\",
        \"elasticbeanstalk:Describe*\",
        \"elasticbeanstalk:List*\",
        \"elasticbeanstalk:RequestEnvironmentInfo\",
        \"elasticbeanstalk:RetrieveEnvironmentInfo\",
        \"elasticbeanstalk:RestartAppServer\",
        \"elasticbeanstalk:UpdateApplication\",
        \"elasticbeanstalk:UpdateApplicationVersion\"
      ],
      \"Resource\": !Join [\"\", [\"arn:aws:elasticbeanstalk:*:\", !Ref \"AWS::AccountId\", \":*\" ] ] 
    }
  ]
}
EOF
  }
}

我收到此错误:

\"policy\" contains an invalid JSON: invalid character \'!\' looking for beginning of value

    标签: json amazon-web-services terraform amazon-cloudformation terraform-provider-aws


    【解决方案1】:

    您可能已经注意到,与 CloudFormation 相比,Terraform 中的连接字符串有点不同。您通常这样做的方式是引用资源属性。如果 ElasticBeanstalk 属性在创建后可用,您可以引用该值。如果没有,您可以使用 Terraform [1] 附带的插值。因此,为了修复错误,您只需为值使用不同的格式:

        document    = <<EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "MyBeanstalkPermissions",
          "Effect": "Allow",
          "Action": [
            "elasticbeanstalk:CreateApplicationVersion",
            "elasticbeanstalk:DeleteApplicationVersion",
            "elasticbeanstalk:UpdateEnvironment",
            "elasticbeanstalk:CreateStorageLocation",
            "elasticbeanstalk:Check*",
            "elasticbeanstalk:Describe*",
            "elasticbeanstalk:List*",
            "elasticbeanstalk:RequestEnvironmentInfo",
            "elasticbeanstalk:RetrieveEnvironmentInfo",
            "elasticbeanstalk:RestartAppServer",
            "elasticbeanstalk:UpdateApplication",
            "elasticbeanstalk:UpdateApplicationVersion"
          ],
          "Resource": "arn:aws:elasticbeanstalk:*:<AWS account id>:*"
        }
      ]
    }
    EOF
    

    为了获取帐户 ID,您需要为此使用 data 源。数据源的名称是aws_caller_identity [2]。您必须将数据源添加到 tf 文件:

    data "aws_caller_identity" "current" {}
    

    然后,代替上面 sn-p 中的 &lt;AWS account id&gt; 占位符,您将使用:

    data.aws_caller_identity.current.account_id
    

    然后可用于形成 Elastic Beanstalk ARN:

    "arn:aws:elasticbeanstalk:*:${data.aws_caller_identity.current.account_id}:*"
    

    但是,您也可以考虑使用数据源来创建策略,因为它比 JSON 策略更容易适应 Terraform 的思维方式 [3]。

    另请注意,AWS 账户 ID 的数据源将仅匹配您正在其中执行操作的当前 AWS 账户。如果您需要为另一个账户执行此操作,则需要提供一个值而不是使用数据源引用。


    [1]https://www.terraform.io/language/expressions/strings

    [2]https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity

    [3]https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document

    【讨论】:

    • 非常感谢您非常详细的回复。你太棒了。
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 2012-09-10
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2022-11-06
    相关资源
    最近更新 更多