AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 918381
Accepted
emmdee
emmdee
Asked: 2018-06-27 13:28:17 +0800 CST2018-06-27 13:28:17 +0800 CST 2018-06-27 13:28:17 +0800 CST

Terraform:为远程状态文件选择凭据

  • 772

我在 Terraform 中有现有的基础设施,并且已经使用了一段时间。最近,我交换了本地笔记本电脑的 AWS 凭证(存储在 中的凭证~/.aws/credentials),它停止工作,直到我重新设置这些凭证。

问题是我在 Terraform 源本身中声明了信誉,但它似乎根本没有使用它们。

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
  }
}

provider "aws" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region = "${var.region}"
}



variable "access_key" {
  default = "<hidden_for_stack_exchange_post>"
}

variable "secret_key" {
  default = "<hidden_for_stack_exchange_post>"
}

variable "region" {
  default = "us-east-1"
}

访问 ID 权限是 100% 好的。我在上述 Terraform 变量声明中的aws configure设置中使用相同的帐户 ID 和密钥。~/.aws/credentials

只要有凭据,一切就可以正常工作~/.aws/credentials,但是一旦操作系统级别的凭据消失(即rm ~/.aws/credentials),我在尝试运行 Terraform 操作时会得到以下信息,例如terraform plan:

Failed to load backend:
Error configuring the backend "s3": No valid credential sources found for AWS Provider.
  Please see https://terraform.io/docs/providers/aws/index.html for more information on
  providing credentials for the AWS Provider

Please update the configuration in your Terraform files to fix this error.
If you'd like to update the configuration interactively without storing
the values in your configuration, run "terraform init".

~/.aws/credentials如果我通过运行重新填充aws configure它,它将再次正常工作。

我不明白——如果我的provider设置明确声明要在 Terraform 源代码中使用的凭证,为什么我的操作系统级 AWS 配置很重要?

如何使 Terraform 仅使用我的 Terraform 配置中定义的凭据,而忽略我的操作系统用户配置文件中的内容?

编辑,是Terraform v0.11.7

编辑:请注意,我正在尝试解决为什么在提供者声明中没有使用静态声明的凭据的问题。不寻找替代方法或解决方法。谢谢。

terraform
  • 4 4 个回答
  • 16286 Views

4 个回答

  • Voted
  1. Best Answer
    Mike Marseglia
    2018-12-05T13:38:49+08:002018-12-05T13:38:49+08:00

    你的第一个问题

    如果我的提供程序设置明确声明要在 Terraform 源代码中使用的凭证,为什么我的操作系统级 AWS 配置很重要?

    错误消息“无法加载后端:配置后端“s3”时出错”是指您的后端 S3 配置。

    查看文件./.terraform/terraform.tfstate,您将看到 S3 后端配置。

    Terraform S3 后端不同于 Terraform AWS Provider。错误消息“未找到 AWS Provider 的有效凭证源”。具有误导性。这意味着使用了 AWS Provider 配置,这是错误的。S3 后端凭证单独配置并存储在terraform.tfstate文件中。

    您的操作系统级 AWS 配置很重要,因为如果没有指定 S3 后端凭证,如此处所述https://www.terraform.io/docs/backends/types/s3.html,则 Terraform 默认使用以下顺序:

    1. 环境变量 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY
    2. AWS 共享凭证文件,默认值为“~/.aws/credentials”。

    您没有在 S3 后端配置中指定任何凭证,因此 terraform 默认为 AWS 共享凭证文件。

    您的 S3 后端配置不包含凭据。

    terraform {
      backend "s3" {
        bucket = "example_tf_states"
        key    = "global/vpc/us_east_1/example_state.tfstate"
        encrypt = true
        region     = "us-east-1"
      }
    }
    

    你的第二个问题,

    如何使 Terraform 仅使用我的 Terraform 配置中定义的凭据,而忽略我的操作系统用户配置文件中的内容?

    首先,后端不能包含插值,请参阅https://www.terraform.io/docs/backends/config.html。因此,您不能在后端配置中使用任何变量。例如此配置无效

    terraform {
      backend "s3" {
        bucket = "example_tf_states"
        key    = "global/vpc/us_east_1/example_state.tfstate"
        encrypt = true
        region     = "us-east-1"
        access_key = ${var.access_key}
        secret_key = ${var.secret_key}
      }
    }
    

    如果您想在运行时指定 AWS 凭证,terraform init请将后端配置指定为选项。

    terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"

    这会生成一个如下所示的 S3 后端配置,存储在 ./.terraform/terraform.tfstate文件中:

    {
        "version": 3,
        "serial": 1,
        "lineage": "bd737d2d-1181-ed64-db57-467d14d2155a",
        "backend": {
            "type": "s3",
            "config": {
                "access_key": "your_access_key",
                "secret_key": "your_secret_key"
            },
            "hash": 9345827190033900985
        },
    

    同样,S3 后端凭证与您的 AWS Provider 凭证分开配置。

    重新运行terraform init并在命令行上指定凭据作为--backend-config修复错误的选项。

    • 12
  2. bodgit
    2018-12-05T03:17:26+08:002018-12-05T03:17:26+08:00

    您遇到的错误专门指的是配置 S3 后端,AFAIK 不会从 AWS 提供商配置中继承设置;它也有access_key&secret_key配置选项,如果您不使用~/.aws/credentials,则需要明确配置。

    • 3
  3. Mike
    2018-06-27T14:21:26+08:002018-06-27T14:21:26+08:00

    您最好在文件中设置配置~/.aws/credentials文件,例如

    [profile1]
    aws_access_key_id = xxxx
    aws_secret_access_key = xxxxx
    region = us-east-1
    
    [profile2]
    aws_access_key_id = xxxx
    aws_secret_access_key = xxxx
    region = us-west-2
    

    然后在您的提供商中,您可以告诉它使用哪个配置文件

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

    它会将密钥保留在您的 terraform 文件之外,如果您想将它们放入源代码管理中,这是一件好事。

    • 1
  4. Prabath Dolawatta
    2020-11-10T13:53:59+08:002020-11-10T13:53:59+08:00

    我也有同样的问题,解决这个问题的最简单和安全的方法之一是配置 AWS 配置文件。即使您在项目中正确提及了 AWS_PROFILE,您也必须在 backend.tf 中再次提及它。

    我的问题是,我已经在项目中设置了 AWS 提供商,如下所示,它工作正常。

    provider "aws" {
    region = "${var.AWS_REGION}"
    profile = "${var.AWS_PROFILE}"
    }
    

    但项目结束时我试图配置 S3 后端配置文件。因此我运行了命令terraform init,我也得到了同样的错误信息。

    Error: error configuring S3 Backend: no valid credential sources for S3 Backend found.
    

    请注意,这对于 terraform 后端配置是不够的。您还必须在后端文件中提及AWS_PROFILE。

    • 完整的解决方案

    我现在正在使用 terraform 最新版本。它是 v0.13.5。请注意,您也不能在后端文件中使用变量。

    请看provider.tf

    provider "aws" {
    region = "${var.AWS_REGION}"
    profile = "${var.AWS_PROFILE}" # lets say profile is my-profile
    }
    

    例如,您的 AWS_PROFILE 是我的个人资料 ,那么您backend.tf应该如下所示。

    terraform {
        backend "s3" {
        bucket = "my-terraform--bucket"
        encrypt = true
        key = "state.tfstate"
        region = "ap-southeast-2"
        profile = "my-profile" # you have to give the profile name here. not the variable("${var.AWS_PROFILE}")
      }
    }
    

    然后运行terraform init

    • 0

相关问题

  • 使用 Terraform 创建 GCE 实例,附加辅助磁盘时出错?

  • Terraform,在污点上出现“模块根目录没有资源”错误

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve