首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提供region_name‘$region’不匹配支持的Windows格式(CMD)

提供region_name‘$region’不匹配支持的Windows格式(CMD)
EN

Stack Overflow用户
提问于 2022-01-01 05:52:11
回答 1查看 1.7K关注 0票数 1

我正在尝试使用Terraform部署ECS,当我准备ECR时,它会抛出上面的错误,这种情况正在发生。它尝试删除双引号,然后启用跟踪以进行故障排除。我也尝试过更新最新版本的terraform (v1.1.2)。

这里是来自main.tf文件的代码块

代码语言:javascript
复制
# Inherit configuration from CLI tools.  No nice way to pull in the region from ~/.aws/config

provider "aws" {
  region = var.region
  profile = var.profile
}

resource "null_resource" "push" {
  provisioner "local-exec" {
    command = <<EOF
aws ecr get-login-password --region "$region" | docker login --username AWS --password-stdin "$ecr_fqdn"
docker tag "servian/techchallengeapp:latest" "$repository"
docker push "$repository:latest"
docker logout "$ecr_fqdn"
EOF

    environment = {
      ecr_fqdn = regex("^([^/]*)/", aws_ecr_repository.ecs.repository_url).0
      region = var.region
      repository = aws_ecr_repository.ecs.repository_url
    }
  }
  depends_on = [aws_ecr_repository.ecs]
}

variable.tf文件中的代码块

代码语言:javascript
复制
variable "region" {
     description = "Region to deploy app"
     default = "ap-southeast-2"
   }

请在下面查找错误

代码语言:javascript
复制
null_resource.push: Creating...
2022-01-04T13:50:08.315+1100 [INFO]  Starting apply for null_resource.push
2022-01-04T13:50:08.315+1100 [DEBUG] null_resource.push: applying the planned Create change
2022-01-04T13:50:08.315+1100 [TRACE] GRPCProvider: ApplyResourceChange
2022-01-04T13:50:08.315+1100 [TRACE] NodeAbstractResouceInstance.writeResourceInstanceState to workingState for null_resource.push
2022-01-04T13:50:08.315+1100 [TRACE] NodeAbstractResouceInstance.writeResourceInstanceState: writing state object for null_resource.push
2022-01-04T13:50:08.315+1100 [TRACE] applyProvisioners: provisioning null_resource.push with "local-exec"
null_resource.push: Provisioning with 'local-exec'...
null_resource.push (local-exec): Executing: ["cmd" "/C" "aws ecr get-login-password --region \"$region\" | docker login --username AWS --password-stdin \"$ecr_fqdn\"\r\ndocker tag \"servian/techchallengeapp:latest\" \"$repository\"\r\ndocker push \"$repository:latest\"\r\ndocker logout \"$ecr_fqdn\"\r\n"]

null_resource.push (local-exec): **Provided region_name '"$region"' doesn't match a supported format.**
null_resource.push (local-exec): Error: Cannot perform an interactive login from a non TTY device
2022-01-04T13:50:09.038+1100 [WARN]  Errors while provisioning null_resource.push with "local-exec", so aborting
2022-01-04T13:50:09.038+1100 [TRACE] evalApplyProvisioners: null_resource.push provisioning failed, but we will continue anyway at the caller's request
2022-01-04T13:50:09.038+1100 [TRACE] maybeTainted: null_resource.push encountered an error during creation, so it is now marked as tainted
2022-01-04T13:50:09.038+1100 [TRACE] NodeAbstractResouceInstance.writeResourceInstanceState to workingState for null_resource.push
2022-01-04T13:50:09.038+1100 [TRACE] NodeAbstractResouceInstance.writeResourceInstanceState: writing state object for null_resource.push
2022-01-04T13:50:09.038+1100 [TRACE] statemgr.Filesystem: have already backed up original terraform.tfstate to terraform.tfstate.backup on a previous write
2022-01-04T13:50:09.040+1100 [TRACE] statemgr.Filesystem: state has changed since last snapshot, so incrementing serial to 85
2022-01-04T13:50:09.040+1100 [TRACE] statemgr.Filesystem: writing snapshot at terraform.tfstate
2022-01-04T13:50:09.046+1100 [TRACE] vertex "null_resource.push": visit complete
2022-01-04T13:50:09.046+1100 [TRACE] dag/walk: upstream of "aws_ecs_task_definition.ecs" errored, so skipping
2022-01-04T13:50:09.046+1100 [TRACE] dag/walk: upstream of "null_resource.updatedb" errored, so skipping
2022-01-04T13:50:09.046+1100 [TRACE] dag/walk: upstream of "provider[\"registry.terraform.io/hashicorp/null\"] (close)" errored, so skipping
2022-01-04T13:50:09.047+1100 [TRACE] dag/walk: upstream of "aws_ecs_service.ecs" errored, so skipping
2022-01-04T13:50:09.047+1100 [TRACE] dag/walk: upstream of "provider[\"registry.terraform.io/hashicorp/aws\"] (close)" errored, so skipping
2022-01-04T13:50:09.047+1100 [TRACE] dag/walk: upstream of "meta.count-boundary (EachMode fixup)" errored, so skipping
2022-01-04T13:50:09.047+1100 [TRACE] dag/walk: upstream of "root" errored, so skipping
2022-01-04T13:50:09.047+1100 [TRACE] statemgr.Filesystem: have already backed up original terraform.tfstate to terraform.tfstate.backup on a previous write
2022-01-04T13:50:09.049+1100 [TRACE] statemgr.Filesystem: state has changed since last snapshot, so incrementing serial to 86
2022-01-04T13:50:09.049+1100 [TRACE] statemgr.Filesystem: writing snapshot at terraform.tfstate
╷
│ Error: local-exec provisioner error
│
│   with null_resource.push,
│   on main.tf line 191, in resource "null_resource" "push":
│  191:   provisioner "local-exec" {
│
│ Error running command 'aws ecr get-login-password --region "$region" |
│ docker login --username AWS --password-stdin "$ecr_fqdn"
│ docker tag "servian/techchallengeapp:latest" "$repository"
│ docker push "$repository:latest"
│ docker logout "$ecr_fqdn"
│ ': exit status 1. Output:
│ Provided region_name '"$region"' doesn't match a supported format.
│ Error: Cannot perform an interactive login from a non TTY device
│
╵
2022-01-04T13:50:09.053+1100 [TRACE] statemgr.Filesystem: removing lock metadata file .terraform.tfstate.lock.info
2022-01-04T13:50:09.053+1100 [TRACE] statemgr.Filesystem: unlocked by closing terraform.tfstate
2022-01-04T13:50:09.054+1100 [DEBUG] provider.stdio: received EOF, stopping recv loop: err="rpc error: code = Unavailable desc = transport is closing"
2022-01-04T13:50:09.054+1100 [DEBUG] provider.stdio: received EOF, stopping recv loop: err="rpc error: code = Unavailable desc = transport is closing"
2022-01-04T13:50:09.064+1100 [DEBUG] provider: plugin process exited: path=.terraform/providers/registry.terraform.io/hashicorp/null/3.1.0/windows_amd64/terraform-provider-null_v3.1.0_x5.exe pid=38252
2022-01-04T13:50:09.064+1100 [DEBUG] provider: plugin exited
2022-01-04T13:50:09.070+1100 [DEBUG] provider: plugin process exited: path=.terraform/providers/registry.terraform.io/hashicorp/aws/3.70.0/windows_amd64/terraform-provider-aws_v3.70.0_x5.exe pid=31016
2022-01-04T13:50:09.070+1100 [DEBUG] provider: plugin exited

也检查了我的AWS区域

代码语言:javascript
复制
    $ aws configure get region
     ap-southeast-2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-02 17:50:32

更新的

${ ... }序列是Terraform配置语言中的一种插值,它计算标记之间给定的表达式。Unix通常使用$..

根据正式文件command是在shell中计算的,可以使用环境变量或Terraform变量。所以,基本上,你想要达到的目标应该从根本上起作用。

我做了一个快速的测试,并且能够成功地在本地应用:

双引号

代码语言:javascript
复制
null_resource.ecr_login: Creating...
null_resource.ecr_login: Provisioning with 'local-exec'...
null_resource.ecr_login (local-exec): Executing: ["/bin/sh" "-c" "aws ecr get-login-password --region \"$region\" | docker login --username AWS --password-stdin \"$ecr_fqdn\"\n"]
null_resource.ecr_login (local-exec): Login Succeeded
null_resource.ecr_login: Creation complete after 2s [id=6191522068151349753]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

没有双引号:

代码语言:javascript
复制
null_resource.ecr_login: Creating...
null_resource.ecr_login: Provisioning with 'local-exec'...
null_resource.ecr_login (local-exec): Executing: ["/bin/sh" "-c" "aws ecr get-login-password --region $region | docker login --username AWS --password-stdin $ecr_fqdn\n"]
null_resource.ecr_login (local-exec): Login Succeeded
null_resource.ecr_login: Creation complete after 2s [id=931251830265041579]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

现在,让我们看一下您遇到的错误

代码语言:javascript
复制
null_resource.push: Provisioning with 'local-exec'...
null_resource.push (local-exec): Executing: ["cmd" "/C" "aws ecr get-login-password --region \"$region\" | docker login --username AWS --password-stdin \"$ecr_fqdn\"\r\ndocker tag \"servian/techchallengeapp:latest\" \"$repository\"\r\ndocker push \"$repository:latest\"\r\ndocker logout \"$ecr_fqdn\"\r\n"]

null_resource.push (local-exec): **Provided region_name '"$region"' doesn't match a supported format.**
null_resource.push (local-exec): Error: Cannot perform an interactive login from a non TTY device
2022-01-04T13:50:09.038+1100 [WARN]  Errors while provisioning null_resource.push with "local-exec", so aborting

似乎您正在尝试在Windows命令提示符上执行这些命令,这也是用引号执行的,而CMD不知何故不知道如何处理它。这是一个类似问题

无论如何,我建议在terraform locals块中执行regex操作,然后简单地使用terraform本机变量和本地值。

就像这样:

代码语言:javascript
复制
locals{
  ecr_fqdn = regex("^([^/]*)/", aws_ecr_repository.ecs.repository_url.0
}

null_resource

代码语言:javascript
复制
resource "null_resource" "push" {
  provisioner "local-exec" {
    command = <<EOF
aws ecr get-login-password --region ${var.region} | docker login --username AWS --password-stdin ${local.ecr_fqdn}
docker tag "servian/techchallengeapp:latest" ${aws_ecr_repository.ecs.repository_url}
docker push "${aws_ecr_repository.ecs.repository_url}:latest"
docker logout ${local.ecr_fqdn}
EOF
  }
  depends_on = [aws_ecr_repository.ecs]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70547172

复制
相关文章

相似问题

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