4

我正在使用terraform cloud来管理 AWS 中预置的基础设施的状态。

我正在尝试使用terraform import导入当前不受 terraform 管理的现有资源。

我知道terraform import这是一个仅限本地的命令。我已经设置了一个工作区引用,如下所示:

terraform {
  required_version = "~> 0.12.0"

  backend "remote" {
    hostname = "app.terraform.io"
    organization = "foo"

    workspaces {
      name = "bar"
    }
  }
}

AWS 凭证是在远程云工作区中配置的,但 terraform 似乎没有从工作区引用 AWS 凭证,而是回退尝试使用指向不同 AWS 账户的本地凭证。我希望 Terraform 在运行时通过引用工作区中的变量来使用凭据terraform import

当我注释掉本地配置的凭据时,出现错误:

Error: No valid credential sources found for AWS Provider.

我本来希望 terraform 使用工作区中配置的凭据。

请注意,当我直接从云控制台运行 plan/apply 命令时,terraform 能够正确使用凭据。

4

2 回答 2

1

根据导入文档的后端部分,在 Terraform Cloud 中运行,而在plan本地运行。因此,导入命令将无权访问 Terraform Cloud 中设置的工作区凭据。从文档:applyimport

为了将 Terraform 导入与远程状态后端一起使用,您可能需要设置与远程工作区变量等效的本地变量。

因此,不要在本地运行以下命令(假设您已向 Terraform Cloud 提供了访问密钥):

terraform import aws_instance.myserver i-12345

我们应该运行例如:

export AWS_ACCESS_KEY_ID=abc
export AWS_SECRET_ACCESS_KEY=1234
terraform import aws_instance.myserver i-12345

其中AWS_ACCESS_KEY_ID和 与AWS_SECRET_ACCESS_KEYTerraform Cloud 中配置的权限相同。

AWS SSO 用户注意事项

如果您使用的是 AWS SSO 和 CLI v2,则根据此 AWS 提供商问题添加了 terraform 能够为 sso 使用凭证缓存的功能。使用 SSO 配置文件导入的步骤如下:

  • 确保您已执行登录并与例如aws sso login --profile my-profile
  • 使配置文件名称可用于 terraform 作为环境变量,例如AWS_PROFILE=my-profile terraform import aws_instance.myserver i-12345

如果显示以下错误,请确保您使用的是 cli > 2.1.23 版本

Error: SSOProviderInvalidToken: the SSO session has expired or is invalid
│ caused by: expected RFC3339 timestamp: parsing time "2021-07-18T23:10:46UTC" as "2006-01-02T15:04:05Z07:00": cannot parse "UTC" as "Z07:00"
于 2021-06-10T20:45:14.867 回答
0

使用数据提供者,例如:-

data "terraform_remote_state" "test" {
  backend = "s3"
  config = {
    bucket = "BUCKET_NAME"
    key    = "BUCKET_KEY WHERE YOUR TERRAFORM.TFSTATE FILE IS PRESENT"
    region = "CLOUD REGION"
  }
}

现在您可以调用您配置的资源示例:-

获取 VPC ID:-

data.terraform_remote_state.test.*.outputs.vpc_id

只需将您要引用的云资源属性导出为输出并存储在 terraform.tfstate 文件中

于 2020-05-12T05:18:13.180 回答