課題
Terraformの初心者ですが、
TerraformからAWSへアクセスする際に、いつも便宜上このように直接ソース内に書いたが、
variable "region" {
default = "ap-northeast-1"
}
variable "access_key" {
default = "自分のaccess_key"
}
variable "secret_key" {
default = "自分のsecret_key"
}
# AWS プロバイダの設定
provider "aws" {
access_key = var.access_key
secret_key = var.secret_key
region = var.region
}
最近ソース内に書くと漏洩しやすいかというご意見を部署内から頂いて、
Windowsの環境変数に格納し、Terraformへ読み込む方法を調べてみました。
今回はこちらの記事の方法を試したけど、うまくいかなかった。。。
やり方、記事から抜粋↓↓↓
provider "aws" { }
$ export AWS_ACCESS_KEY_ID="自分のkey"
$ export AWS_SECRET_ACCESS_KEY="自分のkey"
$ export AWS_DEFAULT_REGION="ap-northeast-1"
$ terraform plan
結局私の場合、これだけ実行すると、以下のエラーが出た。。。
Planning failed. Terraform encountered an error while generating this plan.
╷
│ Error: validating provider credentials: retrieving caller identity from STS: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: fdef4df2-5afd-4e07-aa6e-be3039c0fc03, api error InvalidClientTokenId: The security token included
in the request is invalid.
│
│ with provider["registry.terraform.io/hashicorp/aws"],
│ on main.tf line 2, in provider "aws":
│ 2: provider "aws" {
前提
・AWS-CLIインストール済み
・有効なAWSユーザーのアクセスキーを発行済み
・環境変数設定済み
$ export AWS_ACCESS_KEY_ID="自分のkey"
$ export AWS_SECRET_ACCESS_KEY="自分のkey"
$ export AWS_DEFAULT_REGION="ap-northeast-1"
・AWS-CLIでAWSへアクセスできることを確認済み
・Terraformインストール済み
対処方法
いろいろ調べて最善かわからないが、以下のサイトを見て解決した!
要するに、Windowsの環境変数をTerraformに読み込みたい場合、変数名の先頭にTF_VARをつけないと、Terraformがちゃんと読み込めないらしいです。
Terraformのソースコードをこう書けば、
variable "region" {
default = "ap-northeast-1"
}
variable "access_key " {
}
variable "secret_key " {
}
# AWS プロバイダの設定
provider "aws" {
access_key = var.access_key
secret_key = var.secret_key
region = var.region
}
最後、無事読み込めるようになった!!
※補足
英語の記事で見かけた意見ですが、
「Terraform変数の読み込み優先順位として、Windows環境変数が一番最後なのでエラーが起こりがち(読み込みが失敗しやすい、途中で何かにより上書きされやすい)、
いまはWindows環境変数おすすめしない、、、terraformのvarとして書くかtfvarファイル内に格納するかがベター」というのがあった。。。
今回はAWS_ACCESS_KEY_IDがうまくTerraformに読み込めないのは私のWindows環境内だけの問題かもしれないんすね。。。
終わりに
AWSアクセスの扱い方について、やり方はいろいろあるのが分かった!
結局Windows環境変数で管理するのは失敗しやすいかもしれない、terraformのvarとして書くかtfvarファイル内に格納するのがベターかもしれない、というのがあった。。。
しかし、PJのセキュリティ制約を考慮するとTerraformファイル内に書いちゃっダメ、っていう場合もあるよね。。。
場合によってどっちが最善か考える必要があるかもしれない。。。
今回はTF_VARをつけて対応したが、機会があればほかのやり方も検討してみたいと思った!