【问题标题】:Terraform cloud : Import existing resourceTerraform 云:导入现有资源
【发布时间】:2020-08-27 20:27:48
【问题描述】:

我正在使用 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 能够正确使用凭据。

【问题讨论】:

    标签: terraform terraform-provider-aws terraform-cloud


    【解决方案1】:

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

    为了将 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_IDAWS_SECRET_ACCESS_KEY 与 Terraform Cloud 中配置的权限相同。

    AWS SSO 用户注意事项

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

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

    如果显示以下错误,请确保您是using a version of the 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"
    

    【讨论】:

      【解决方案2】:

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

      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 文件中

      【讨论】:

      • 我正在尝试导入不受 terraform 管理的现有资源。 terraform_remote_state 在这种情况下无济于事。
      • 从现有基础设施生成 terraform 文件不是问题。我已经确定了资源。我的主要挑战是terraform import 似乎没有引用云工作区变量,而是使用本地变量作为凭据。
      猜你喜欢
      • 2020-04-29
      • 2021-01-04
      • 2020-01-23
      • 2021-04-17
      • 2018-05-06
      • 2021-05-25
      • 2023-01-02
      • 2020-04-30
      • 2021-12-27
      相关资源
      最近更新 更多