AWSアクセスキーを環境変数に格納し、Terraformに読み込み失敗時の対応方法：Error: validating provider credentials: retrieving caller identity from STS

# 課題
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へ読み込む方法を調べてみました。

今回はこちらの記事の方法を試したけど、うまくいかなかった。。。

https://qiita.com/Hikosaburou/items/1d3765d85d5398e3763f#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%86

やり方、記事から抜粋↓↓↓

```
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"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/6a11afb6-f300-4023-2e54-fa73e962d9a0.png)

・.aws配下の認証情報設定済み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/48a4635a-59cc-acef-ba52-c83621bbbbe6.png)

・AWS-CLIでAWSへアクセスできることを確認済み
・Terraformインストール済み

# 対処方法

いろいろ調べて最善かわからないが、以下のサイトを見て解決した！

https://stackoverflow.com/questions/55052153/how-to-configure-environment-variables-in-hashicorp-terraform


https://ponpon-soft.com/entry/2022/02/03/180956

要するに、Windowsの環境変数をTerraformに読み込みたい場合、変数名の先頭に**TF_VAR**をつけないと、Terraformがちゃんと読み込めないらしいです。

環境変数をこのように設定し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/55c5e658-39d3-839a-1f74-bdd82eaacaeb.png)

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

最後、無事読み込めるようになった！！

:::note info
※補足
英語の記事で見かけた意見ですが、
「Terraform変数の読み込み優先順位として、Windows環境変数が一番最後なのでエラーが起こりがち（読み込みが失敗しやすい、途中で何かにより上書きされやすい）、
いまはWindows環境変数おすすめしない、、、terraformのvarとして書くかtfvarファイル内に格納するかがベター」というのがあった。。。

今回はAWS_ACCESS_KEY_IDがうまくTerraformに読み込めないのは私のWindows環境内だけの問題かもしれないんすね。。。
:::

# 終わりに

AWSアクセスの扱い方について、やり方はいろいろあるのが分かった！

結局Windows環境変数で管理するのは失敗しやすいかもしれない、terraformのvarとして書くかtfvarファイル内に格納するのがベターかもしれない、というのがあった。。。

しかし、PJのセキュリティ制約を考慮するとTerraformファイル内に書いちゃっダメ、っていう場合もあるよね。。。

場合によってどっちが最善か考える必要があるかもしれない。。。

今回は**TF_VAR**をつけて対応したが、機会があればほかのやり方も検討してみたいと思った！