【问题标题】:terraform cli does not accept aws credentialsterraform cli 不接受 aws 凭据
【发布时间】:2019-11-13 12:43:10
【问题描述】:

我正在尝试使用 terraform 创建 ec2 实例。通过 terraform cli 传递凭据失败,而在 main.tf 中对其进行硬编码工作正常

这是使用terraform动态创建ec2实例

terraform apply 适用于以下 main.tf

provider "aws" {
  region     = "us-west-2"
  access_key = "hard-coded-access-key"
  secret_key = "hard-coded-secret-key"
}
resource "aws_instance" "ec2-instance" {
  ami = "ami-id"
  instance_type = "t2.micro"
  tags {
    Name = "test-inst"
   }
}

虽然以下不起作用:

terraform apply -var access_key="hard-coded-access-key" -var secret_key="hard-coded-secret-key"

以上两种运行命令的方式有区别吗?根据 terraform 文档,上述两种方法都应该有效。

【问题讨论】:

    标签: amazon-ec2 terraform


    【解决方案1】:

    每个terraform 模块都可以使用输入变量,包括主模块。但在使用输入变量之前,必须先声明它们。

    在您拥有main.tf 文件的同一文件夹中创建一个variables.tf 文件:

    variable "credentials" {
      type = object({
        access_key = string
        secret_key = string
      })
    
      description = "My AWS credentials"
    }
    

    然后您可以像这样在代码中引用输入变量:

    provider "aws" {
      region     = "us-west-2"
      access_key = var.credentials.access_key
      secret_key = var.credentials.secret_key
    }
    

    你可以运行:

    terraform apply -var credentials.access_key="hard-coded-access-key" -var credentials.secret_key="hard-coded-secret-key"

    或者您可以创建一个terraform.tfvars 文件,其内容如下:

    # ------------------
    # AWS Credentials
    # ------------------
    credentials= {
      access_key = "hard-coded-access-key"
      secret_key = "hard-coded-secret-key"
    }
    

    然后只需运行terraform apply

    但关键是你必须在使用输入变量之前声明它们。

    【讨论】:

      【解决方案2】:

      @Felipe 的答案是正确的,但我绝不建议在 variables.tf 中定义访问密钥和秘密密钥,您要做的就是让它闪烁并使用 aws configure 或其他选项设置密钥用于 terraform 部署的密钥仅使用 aws configure --profile terraform 或不使用配置文件 aws configur

      因此您的 connection.tf 或 main.tf 将如下所示,

      provider "aws" {
        #You can use an AWS credentials file to specify your credentials.
        #The default location is $HOME/.aws/credentials on Linux and OS X, or "%USERPROFILE%\.aws\credentials" for Windows users
        region              = "us-west-2"
      # profile configured during aws configure --profile
        profile             = "terraform"
      # you can also restrict account here, to allow particular account for deployment
        allowed_account_ids = ["12*****45"]
      }
      

      您还可以将密钥和访问密钥分开文件,这是因为Variables.tf是您的配置语言或bitbucket的一部分,因此最好不要将这些敏感密钥放在variables.tf中

      您可以在系统中的某处创建一个文件,并在提供程序部分提供密钥的路径。

      provider "aws" {
        region              = "us-west-2"
        shared_credentials_file = "$HOME/secret/credentials"
      }
      

      这是凭证文件的格式

      [default]
      aws_access_key_id = A*******Z
      aws_secret_access_key = A*******/***xyz
      

      【讨论】:

      • 感谢您的建议,但是,我将它与 teamcity 结合使用,因此我将在 teamcity 环境变量中存储凭据并将环境变量传递给 terraform 文件。我还没有尝试过,但是一旦我使用变量文件让变量工作,这将是下一步。
      • 听起来不错,您可以使用上面的答案,我唯一推荐的就是以这种方式使用${var.credentials.access_key} 插值。
      猜你喜欢
      • 1970-01-01
      • 2011-12-19
      • 2020-01-03
      • 2020-06-08
      • 2016-09-25
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多