运行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策略文档格式正确,我看不到任何明显的东西.
一个团队已经将一个cloudformation模板编写为一个.yml提供一堆资源的文件.
是否可以通过在Terraform中执行来利用此文件?还是必须重写?
我是terraform的新手,刚入门.
如果我使用AWS CLI,我会执行这样的命令,
aws cloudformation create-stack --stack-name my-new-stack --template-body file://mystack.yml --parameters ParameterKey = AmiId
我想在我的terraform配置中包含相当于此命令的内容.
如果有可能,你可以给我一个例子,我真的很感激.
谢谢!
我正在使用AWS CodeBuild和Terraform自动部署基于Lambda的服务.我有一个非常简单的buildscript.yml完成以下内容:
"获取信用档案"这一步骤是我遇到困难的地方.我有一个简单的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工作凭据.
谢谢!
我想将多个IAM策略ARN附加到单个IAM角色.
一种方法是创建具有所有策略(多个策略)特权的新策略.
但在AWS,我们有一些预定义的IAM策略,例如AmazonEC2FullAccess,AmazomS3FullAccess等我想用它们的组合为我的角色.
我在Terraform文档中找不到这样做的方法.
根据文档,我们可以使用aws_iam_role_policy_attachment将策略附加到角色,但不能将多个策略附加到角色,因为这可以通过AWS控制台获得.
如果有方法可以做同样的事情,或者它仍然是要添加的功能,请告诉我.
我使用的Terraform版本是 v0.9.5
我正在使用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字符串是否包含另一个字符串?
例如,我想特别在名称中使用"tmp"处理terraform工作区(例如,允许在没有快照的情况下删除rds实例),所以像这样:
locals
{
is_tmp = "${"tmp" in terraform.workspace}"
}
Run Code Online (Sandbox Code Playgroud)
据我所知,substr插值函数没有实现这一点.
我正处于需要在启动时为EC2实例提供一些软件包的情况。存在两个(企业/公司)约束:
主要由于第二个约束,我想知道在哪里放置配置的最佳位置。这就是我想出的
在Terraform中提供
正如它指出的那样,我只是在terraform中提供必要的实例。如果我将这些资源打包到模块中,则配置不会“泄漏”。缺点
在Packer中置备
这是基于这样的假设,即Packer允许您在AMI之上进行配置,以便可以“扩展” AMI。另外,此方法仅在AWS中使用,因此不必使用其他构建器。Packer中的资源调配使Terraform代码更加简单,并且Terraform代码的应用将变得更快,因为它只是您启动的AMI。
对我来说,这两种方法都有自己的位置。但是我真正想知道的是,什么时候选择Packer Provisioning而不是Terraform Provisioning?
将资源状态从一个项目(即,移动模块调用)迁移到另一个项目的最不痛苦的方法是什么,特别是在使用远程状态存储时?虽然重构在同一个状态文件中相对简单(即,获取此资源并将其移动到子模块,反之亦然),但我没有看到JSON手术的替代方法,用于重构到不同的状态文件,特别是如果我们使用远程(S3)状态(即,取这个子模块并将其移动到另一个项目).
我想将现有的AWS CloudFormation模板(yaml)自动转换为Terraform模板(hcl)。
任何人都可以建议一些工具,方法等吗?
到目前为止,我一直在使用CloudFormation来部署我的lambda.我发现这个过程非常缓慢且效率低下 - 例如.它可能需要几分钟但如果只是部署那个1功能它应该只需几秒钟?大多数功能都没有改变,但我相信CloudFormation无法区分,无论如何都会部署一切.有没有办法可以更有效地做到这一点?比如查看已更改的内容并仅部署更改?
另一个好处是我可能会有更少的版本?