我正在使用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 使用在工作区中配置的凭据。
请注意,当我直接从云控制台运行计划/应用命令时,terraform 能够正确使用凭据。
根据导入文档的后端部分,plan
和apply
在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_ID
和AWS_SECRET_ACCESS_KEY
具有与 Terraform Cloud 中配置的权限相同的权限。
Note for AWS SSO users
如果您使用的是 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"
使用数据提供程序,例如:-
data "terraform_remote_state" "test" {
backend = "s3"
config = {
bucket = "BUCKET_NAME"
key = "BUCKET_KEY WHERE YOUR TERRAFORM.TFSTATE FILE IS PRESENT"
region = "CLOUD REGION"
}
}
现在,您可以调用预配的资源 例:-
要获取专有网络 ID:-
data.terraform_remote_state.test.*.outputs.vpc_id
只需将要引用的云资源属性导出为输出并存储在terraform.tfstate文件中即可