Terraform,从null_resource,local-exec和AWS CLI

时间:2016-07-25 09:57:58

标签: amazon-web-services aws-cli amazon-cognito terraform

我正在使用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邮件列表上问过这个问题,但我想我会尝试更广泛的受众。

谢谢, 添

2 个答案:

答案 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
}