首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将AWS云格式的YAML连接格式写入Terraform格式?

如何将AWS云格式的YAML连接格式写入Terraform格式?
EN

Stack Overflow用户
提问于 2022-07-24 08:51:52
回答 1查看 79关注 0票数 1

我正在尝试将文档转换为Terraform文件来创建策略。然而,当我尝试用",“或试图将其转换为JSON时,Join format under the Resource section似乎也不被接受。我可以寻求一些帮助吗?如何按照Terraform正确解释它的方式格式化它?下面是我正在处理的terraform文件。事先非常感谢。

代码语言:javascript
运行
复制
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
  }
}

我知道这个错误:

代码语言:javascript
运行
复制
"policy" contains an invalid JSON: invalid character '!' looking for beginning of value
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-24 09:15:42

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

代码语言:javascript
运行
复制
    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文件中:

代码语言:javascript
运行
复制
data "aws_caller_identity" "current" {}

然后,您将使用以下命令来代替上面片段中的<AWS account id>占位符:

代码语言:javascript
运行
复制
data.aws_caller_identity.current.account_id

然后,它可以用来形成弹性豆柄ARN:

代码语言:javascript
运行
复制
"arn:aws:elasticbeanstalk:*:${data.aws_caller_identity.current.account_id}:*"

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

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

1

2

3

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73096967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档