首页 > 解决方案 > 即使没有 Vault,也不想为 Terraform 提供密钥 - 如何?

问题描述

为了在 aws 上启动具有 ssh 访问权限的 ec2 实例,必须执行下面的编辑密钥并不特别满意。

我是否达到了没有保险库的限制?

当相对于“解释性”文本发布大量代码时,通过 stackoverflow 的自动化可能会出现问题。

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 2.0"
    }
  }

  backend "s3" {
    bucket = "terraformredactedbucket"
    key = "global/s3/terraform.tfstate"
    region = "us-west-2"
    dynamodb_table = "terraformredactedtable"
    encrypt = true
    access_key = "redacted_access_key"
    secret_key = "redacted_secret_key"
 }
}

provider "aws" {
  region = "us-west-2"
  shared_credentials_file = "/Users/redacted/.aws/credentials"
  profile                 = "redacted"
}

resource "aws_key_pair" "redactedtoo-key" {
  key_name = "redactedtoo-key"
  public_key = "redacted_public_key"
}

resource "aws_instance" "redacted-sandbox-1" {
 ami            = "ami-0800fc0fa715fdcfe"
 instance_type  = "t2.micro"
 security_groups = [
   "redacted-sg"
 ]
 key_name = "redactedtoo-key"
 tags  = {
    Name = "redacted-sandbox-1"
    DeploymentState = "Sandbox"
    Function = "RedactedSandBox"
    Project = "Terraform Sandbox"
 }
}

标签: amazon-web-servicesterraformterraform-provider-aws

解决方案


为 AWS 提供商和 S3 后端配置凭证的最理想方式是根本不在您的配置中提及身份验证,而是依赖于会话范围内的身份验证凭证配置的标准机制,即 Terraform 的 AWS 提供商和 S3 后端两者都支持。

首先,让我们从配置中删除身份验证设置,让配置只专注于描述对象的位置。这意味着配置仅描述Terraform 管理的内容,而不是运行 Terraform 的人员或内容

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 2.0"
    }
  }

  backend "s3" {
    bucket         = "terraformredactedbucket"
    key            = "global/s3/terraform.tfstate"
    region         = "us-west-2"
    dynamodb_table = "terraformredactedtable"
    encrypt        = true
 }
}

provider "aws" {
  region = "us-west-2"
}

AWS 有多种不同的方式来配置身份验证。从您的示例中,您似乎在默认位置使用共享凭据文件,但您使用的是该文件中的非默认配置文件。您可以使用环境变量设置配置文件AWS_PROFILE

export AWS_PROFILE="redacted"

如果您想明确说明凭证文件的位置,而不是依赖默认值,您还可以在环境中进行设置:

export AWS_SHARED_CREDENTIALS_FILE=/Users/redacted/.aws/credentials

或者,您可以设置AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY直接指定 Terraform 使用的凭据。

以上假设您将为后端和 AWS 提供商使用相同的凭证的常见情况。在更复杂的情况下,一种常见的方法是使用assume_role,以便您可以将相同的凭证用于多个用例,在使用的凭证和实际执行操作的 AWS 委托人之间创建间接关系。

如果您不能使用assume_role并且仍然需要对提供程序和后端进行单独设置,那么您需要在后端或提供程序中包含一些设置以指定差异,但在任何情况下都不需要放置访问密钥ID 和密钥直接在 Terraform 配置中:相反,您可以为两者使用共享凭证文件,并将后端和提供程序配置为使用不同的配置文件名称。


推荐阅读