我正在使用Terraform在AWS中自动提供Cognito身份池。 AWS提供商尚不支持Cognito,所以我一直在使用null_resource和local-exec来调用AWS CLI。
我有以下资源:
resource "null_resource" "create-identitypool" {
provisioner "local-exec" {
command = "aws cognito-identity create-identity-pool --identity-pool-name terraform_identitypool --no-allow-unauthenticated-identities --developer-provider-name login.terraform.myapp"
}
}
给出以下输出:
null_resource.create-identitypool (local-exec): {
null_resource.create-identitypool (local-exec): "IdentityPoolId": "eu-west-1:22549ad3-1611-......",
null_resource.create-identitypool (local-exec): "AllowUnauthenticatedIdentities": false,
null_resource.create-identitypool (local-exec): "DeveloperProviderName": "login.terraform.myapp",
null_resource.create-identitypool (local-exec): "IdentityPoolName": "terraform_identitypool"
null_resource.create-identitypool (local-exec): }
null_resource.create-identitypool: Creation complete
下一步是将一些我已创建的角色添加到身份池中:
resource "null_resource" "attach-policies-identitypool" {
provisioner "local-exec" {
command = "aws cognito-identity set-identity-pool-roles --identity-pool-id ${null_resource.create-identitypool.IdentityPoolId} --roles authenticated=authroleXXX,unauthenticated=unauthroleXXX"
}
}
问题是我无法提取IdentityPoolId,$ {null_resource.create-identitypool.IdentityPoolId},以便在第二个资源中使用。我理解null_resource没有输出属性,所以如何从命令行输出中获取此JSON对象。我还想使用tirggers并运行aws cognito-identity list-identity-pools和可能的delete-identity-pool来使这一切都可重复,我也需要输出。
有什么想法吗?如果我在其他地方错过了这些信息,我会道歉。我也在Terraform邮件列表上问过这个问题,但我想我会尝试更广泛的受众。
谢谢, 添
答案 0 :(得分:3)
Terraform 0.8中有一个新的数据源,external
,允许您运行外部命令并提取输出。请参阅data.external
。
数据源仅应该用于检索Cognito数据,而不是执行它。由于这是Terraform数据源,因此不应有任何副作用。
答案 1 :(得分:0)
保罗的回答是正确的。但是,仅当shell脚本以JSON格式发送回数据时,外部数据才有效,这需要更多工作。
因此,Matti Paksula为此做了一个模块。 (https://github.com/matti/terraform-shell-resource)。
使用该模块,我们可以获取任何shell脚本本地执行调用的stdout,stderr和退出状态。
这是一个示例main.tf文件。您可以通过任何要运行的命令(包括问题中的命令)来修改此命令。
# Defining a variable , we will feed to the shell script
variable "location" { default = "us-central1-f" }
# Calling Matti's Module
module "shell_execute" {
source = "github.com/matti/terraform-shell-resource"
command = "./scripts/setenv.sh"
}
# Creating a shell script on the fly
resource "local_file" "setenvvars" {
filename = "./scripts/setenv.sh"
content = <<-EOT
#!/bin/bash
export LOCATION=${var.modinput_location}
echo LOCATION $LOCATION
EOT
}
# Now, we get back the output of the script
output "shell_stdout" {
value = module.shell_execute.stdout
}
# Now, we get back if there are any errors
output "shell_stderr" {
value = module.shell_execute.stderr
}
# Now, we get back exit status of the script
output "shell_exitstatus" {
value = module.shell_execute.exitstatus
}