amazon-web-services - 即使没有 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"
}
}
解决方案
为 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_ID
并AWS_SECRET_ACCESS_KEY
直接指定 Terraform 使用的凭据。
以上假设您将为后端和 AWS 提供商使用相同的凭证的常见情况。在更复杂的情况下,一种常见的方法是使用assume_role
,以便您可以将相同的凭证用于多个用例,在使用的凭证和实际执行操作的 AWS 委托人之间创建间接关系。
如果您不能使用assume_role
并且仍然需要对提供程序和后端进行单独设置,那么您需要在后端或提供程序中包含一些设置以指定差异,但在任何情况下都不需要放置访问密钥ID 和密钥直接在 Terraform 配置中:相反,您可以为两者使用共享凭证文件,并将后端和提供程序配置为使用不同的配置文件名称。
推荐阅读
- kubernetes - 我可以减少 Kubernetes 中的容器创建时间吗?
- substrate - 如何处理来自 Substrate 链下工作人员的 http 流响应?
- java - 仅完成某些活动并发送数据
- c++ - 智能指针的语法
- javascript - 在 javascript 中创建表单在 Chrome 中有效,而不是在 Edge 中?
- flutter - 当我按下运行颤振时,它显示“错误:未找到 pubspec.yaml 文件。此命令应从 Flutter 项目的根目录运行。:”
- swift - UIDatePicker 不遵守自动布局约束 iOS 14
- angular - 来自数据库的 ngx-meta 标题描述数据未显示在视图源中,并且 facebook 无法抓取这些标签
- android - 无限的viewpager,只有一项适用于Android
- proxy - 限制 squid 代理中的上传/下载文件大小