对必须执行下面的密文键不太满意以便在aws上使用ssh访问来启动ec2实例。
我没有跳马就达到极限了吗?
当大量的代码被发布;解释性的";文本
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配置中:相反,您可以为两者使用共享凭据文件,并将后端和提供程序配置为使用不同的配置文件名。