Terraform:リモート状態ファイルの資格情報の選択


10

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資格情報が存在する限り、すべてが正常に機能しますが、OSレベルの資格情報が失われると(つまり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ソースコード内で使用する資格情報を明示的に宣言している場合、なぜOSレベルのAWS構成がまったく重要なのですか?

TerraformにTerraform構成で定義された資格情報のみを使用させ、OSユーザープロファイルの内容を無視するにはどうすればよいですか?

編集、それは Terraform v0.11.7

編集:静的に宣言されたクレデンシャルがプロバイダー宣言で利用されていない理由に関する問題を解決しようとしていることに注意してください。代替方法や回避策を探していません。ありがとう。


うーん...ただの予感。AWS_PROFILEまたはAWS_DEFAULT_PROFILE環境変数が設定されていないことを確認してください。これらは、認証情報ファイルで調べる必要があるAWS SDKへのヒントです。
エリックオスターマン2018

ありがとう。返信が遅くなりましたが、私はこれを再訪します。残念ながら、環境変数が存在しないことを確認しました。リモートバックエンドを使用しない他のプランのように、実行時にクレデンシャルを要求することができれば、本当に素晴らしいでしょう。とにかく、ありがとう。
emmdee

回答:


10

最初の質問

私のプロバイダー設定がTerraformソースコード内で使用する資格情報を明示的に宣言している場合、なぜOSレベルのAWS構成がまったく重要なのですか?

「バックエンドのロードに失敗しました:バックエンド "s3"の構成中にエラーが発生しました」というエラーメッセージは、バックエンドS3の構成を参照しています。

ファイル./.terraform/terraform.tfstateを見ると、S3バックエンド構成が表示されます。

Terraform S3バックエンドは、Terraform AWSプロバイダーとは異なります。エラーメッセージ「AWSプロバイダーの有効な認証情報ソースが見つかりません。」誤解を招くです。AWSプロバイダー構成が使用されていることを意味しますが、これは誤りです。S3バックエンドの認証情報は個別に設定され、terraform.tfstateファイルに保存されます。

こちらのhttps://www.terraform.io/docs/backends/types/s3.htmlに記載されているように、S3バックエンドの認証情報が指定されていない場合、Terraformはデフォルトで以下を使用するため、OSレベルのAWS構成が重要になります。

  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"
  }
}

2番目の質問、

TerraformにTerraform構成で定義された資格情報のみを使用させ、OSユーザープロファイルの内容を無視するにはどうすればよいですか?

まず、バックエンドに補間を含めることはできません。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プロバイダーの認証情報とは別に設定されています。

エラーを修正するterraform initための--backend-configオプションとして、コマンドラインで資格情報を再実行して指定します。


ありがとう。非常に詳細な対応と私は今問題を理解しています。私のユースケースではshared_credentials_file、すべてのバックエンドとプロバイダーが収集して使用するオプションを使用してしまいました。正常に動作しているようで、OSワークステーションのaw資格情報に何もロックされていません。
emmdee 2018

3

発生しているエラーは、特にS3バックエンドの構成に関するものであり、AFAIKはAWSプロバイダー構成から設定を継承しません。それはあまりにも持っているaccess_keysecret_keyあなたが使用していない場合は、設定オプション~/.aws/credentialsを明示的に設定する必要があります。


1

あなたはあなたの~/.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ファイルから除外します。これは、キーをソース管理に入れたい場合に適しています。


入力いただきありがとうございます。資格情報のプロファイルについてはよく知っていますが、代わりの方法や回避策ではなく、特定の質問に対する解決策を探しています。この質問の範囲では、資格を変数に含める必要があります。とにかく大歓迎です。
emmdee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.