标签: terraform

通过terraform创建策略时出现MalformedPolicyDocument错误

运行terraform时出现以下错误:

* aws_iam_role_policy.rds_policy: Error putting IAM role policy my-rds-policy: MalformedPolicyDocument: The policy failed legacy parsing
Run Code Online (Sandbox Code Playgroud)

这是我对资源的定义:

resource "aws_iam_role_policy" "rds_policy" {
  name = "my-rds-policy"
  role = "${aws_iam_role.rds_role.id}"
  policy = <<EOF
  {
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket",
              "s3:GetBucketLocation"
          ],
          "Resource": [
              "arn:aws:s3:::my-bucket"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObjectMetaData",
              "s3:GetObject",
              "s3:PutObject",
              "s3:ListMultipartUploadParts",
              "s3:AbortMultipartUpload"
          ],
          "Resource": [
              "arn:aws:s3:::my-bucket/backups/*"
          ]
      }
  ]
}
EOF
}
Run Code Online (Sandbox Code Playgroud)

JSON策略文档格式正确,我看不到任何明显的东西.

amazon-web-services terraform

10
推荐指数
2
解决办法
7312
查看次数

是否可以在Terraform中执行CloudFormation文件?

一个团队已经将一个cloudformation模板编写为一个.yml提供一堆资源的文件.

是否可以通过在Terraform中执行来利用此文件?还是必须重写?

我是terraform的新手,刚入门.

如果我使用AWS CLI,我会执行这样的命令,

aws cloudformation create-stack --stack-name my-new-stack --template-body file://mystack.yml --parameters ParameterKey = AmiId

我想在我的terraform配置中包含相当于此命令的内容.

如果有可能,你可以给我一个例子,我真的很感激.

谢谢!

amazon-web-services aws-cloudformation terraform

10
推荐指数
2
解决办法
5494
查看次数

无法在AWS Codebuild中运行`source`

我正在使用AWS CodeBuild和Terraform自动部署基于Lambda的服务.我有一个非常简单的buildscript.yml完成以下内容:

  • 获得依赖关系
  • 运行测试
  • 获取AWS凭据并保存到文件(详细信息如下)
  • 来源于creds文件
  • 运行Terraform

"获取信用档案"这一步骤是我遇到困难的地方.我有一个简单的bash单行程序,它抓取AWS容器信誉curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,然后按以下格式将它们保存到文件中:

export AWS_ACCESS_KEY_ID=SOMEACCESSKEY
export AWS_SECRET_ACCESS_KEY=MYSECRETKEY
export AWS_SESSION_TOKEN=MYSESSIONTOKEN
Run Code Online (Sandbox Code Playgroud)

当然,显而易见的一步就是简单地source将这些变量添加到我的环境中以供Terraform使用.但是,当我这样做时source /path/to/creds_file.txt,CodeBuild返回:

[Container] 2017/06/28 18:28:26 Running command source /path/to/creds_file.txt
/codebuild/output/tmp/script.sh: 4: /codebuild/output/tmp/script.sh: source: not found
Run Code Online (Sandbox Code Playgroud)

我试图安装source通过,apt但后来我得到一个错误,说source无法找到(是的,我已经运行apt update等).我在CodeBuild的Python 2.7环境中使用标准的Ubuntu映像.如何在Codebuild中为源凭据文件获取Terraform工作凭据.

谢谢!

bash amazon-web-services terraform aws-codebuild

10
推荐指数
2
解决办法
4507
查看次数

如何使用Terraform将多个IAM策略附加到IAM角色?

我想将多个IAM策略ARN附加到单个IAM角色.

一种方法是创建具有所有策略(多个策略)特权的新策略.

但在AWS,我们有一些预定义的IAM策略,例如AmazonEC2FullAccess,AmazomS3FullAccess等我想用它们的组合为我的角色.

我在Terraform文档中找不到这样做的方法.

根据文档,我们可以使用aws_iam_role_policy_attachment将策略附加到角色,但不能将多个策略附加到角色,因为这可以通过AWS控制台获得.

如果有方法可以做同样的事情,或者它仍然是要添加的功能,请告诉我.

我使用的Terraform版本是 v0.9.5

amazon-web-services amazon-iam terraform

10
推荐指数
3
解决办法
1万
查看次数

将JSON字符串解码为terraform map

我正在使用HTTP数据源从内部服务检索数据.该服务返回JSON数据.

我无法插入返回的JSON数据并在其中查找数据.

例如:

模块A.

data "http" "json_data" {
    url = "http://myservice/jsondata"

    # Optional request headers
    request_headers {
       "Accept" = "application/json"
    }
}

output "json_data_key" {
    value = "${lookup(data.http.json_data.body, "mykey")}"
}
Run Code Online (Sandbox Code Playgroud)

main.tf

provider "aws" {
   region = "${var.region}"
   version = "~> 0.1"
}

module "moduleA" {
   source = "../../../terraform-modules/moduleA"
}

resource "aws_instance" "example" {
    ami = "ami-2757f631"
    instance_type = "${module.moduleA.json_data_key}"
}
Run Code Online (Sandbox Code Playgroud)

查找功能将无法在JSON数据中提取密钥.

有没有办法将JSON数据解码为terraform地图?

terraform

10
推荐指数
4
解决办法
8442
查看次数

如何检查字符串是否包含terraform插值中的子字符串?

如何检查terraform字符串是否包含另一个字符串?

例如,我想特别在名称中使用"tmp"处理terraform工作区(例如,允许在没有快照的情况下删除rds实例),所以像这样:

locals
{
  is_tmp = "${"tmp" in terraform.workspace}"
}
Run Code Online (Sandbox Code Playgroud)

据我所知,substr插值函数没有实现这一点.

terraform

10
推荐指数
4
解决办法
5065
查看次数

何时在Packer vs Terraform中进行配置?

我正处于需要在启动时为EC2实例提供一些软件包的情况。存在两个(企业/公司)约束:

  • 我需要在特定的AMI之上进行配置,这将添加诸如LDAP / AD访问之类的企业内容。
  • 这些更改旨在用于所有内部开发机器

主要由于第二个约束,我想知道在哪里放置配置的最佳位置。这就是我想出的

在Terraform中提供

正如它指出的那样,我只是在terraform中提供必要的实例。如果我将这些资源打包到模块中,则配置不会“泄漏”。缺点

  • 我将无法在模块顶部添加一组其他的设置步骤?
  • 设置的更改可能会导致实例在应用时被销毁?
  • 由于要尝试安装软件包,因此耗时很长

在Packer中置备

这是基于这样的假设,即Packer允许您在AMI之上进行配置,以便可以“扩展” AMI。另外,此方法仅在AWS中使用,因此不必使用其他构建器。Packer中的资源调配使Terraform代码更加简单,并且Terraform代码的应用将变得更快,因为它只是您启动的AMI。

对我来说,这两种方法都有自己的位置。但是我真正想知道的是,什么时候选择Packer Provisioning而不是Terraform Provisioning?

amazon-ec2 packer amazon-web-services terraform

10
推荐指数
1
解决办法
4259
查看次数

Terraform:如何在项目之间迁移状态?

将资源状态从一个项目(即,移动模块调用)迁移到另一个项目的最不痛苦的方法是什么,特别是在使用远程状态存储时?虽然重构在同一个状态文件中相对简单(即,获取此资源并将其移动到子模块,反之亦然),但我没有看到JSON手术的替代方法,用于重构到不同的状态文件,特别是如果我们使用远程(S3)状态(即,取这个子模块并将其移动到另一个项目).

amazon-s3 amazon-web-services terraform

10
推荐指数
4
解决办法
2814
查看次数

将AWS CloudFormation转换为Terraform模板

我想将现有的AWS CloudFormation模板(yaml)自动转换为Terraform模板(hcl)。

任何人都可以建议一些工具,方法等吗?

amazon-web-services aws-cloudformation terraform

10
推荐指数
2
解决办法
8954
查看次数

使用Terraform/CloudFormation/Something有效地部署lambda(仅部署那些已更改的)

到目前为止,我一直在使用CloudFormation来部署我的lambda.我发现这个过程非常缓慢且效率低下 - 例如.它可能需要几分钟但如果只是部署那个1功能它应该只需几秒钟?大多数功能都没有改变,但我相信CloudFormation无法区分,无论如何都会部署一切.有没有办法可以更有效地做到这一点?比如查看已更改的内容并仅部署更改?

另一个好处是我可能会有更少的版本?

lambda continuous-integration aws-cloudformation terraform

10
推荐指数
1
解决办法
626
查看次数