個人的によく使うTerraformコマンドとAWS CLI認証

よく使うTerraformコマンドとAWS CLI認証コマンドをメモります。


# 環境
terraform v1.5.0


# Terraformコマンド
## terraform init -backend-config="profile=app_administrator"
リソース定義するときのprofileを設定できる。
個人で持つawsアカウントと組織で使うawsアカウントをそれぞれ使い分けたい時などに使える。（defaultを参照して欲しくない時も同様）

```bash
$ terraform init -backend-config="profile=private_app_administrator"
```

とはいえ、profileだけでなく`backend-config`に指定する値を切り替えることで、複数の展開先にプロビジョニングすることができる。
例えば、一部のattributeはbackendブロックに書いて、書いていないものだけ`backend-config`で設定することもできる。

```terraform:backend.tf
terraform {
  backend "s3" {
    bucket = "hoge-credentials"
    key    = "example/prod/app_v1.5.0.tfstate"
    # region = "ap-northeast-1" // リージョンをオプションで指定
  }
}

```
```bash
$ terraform init -backend-config="region=us-east-1"
```

## terraform apply -var="hoge=fuga"
変数をコマンド実行時に上書きすることができる。
例えば、NATゲートウェイやALBといったサービス定義で、開発中無駄に起動して料金が発生して欲しくない時などに使える。（変数参照してリソース作成を操作）

```terraform: nat_gateway.tf
resource "aws_nat_gateway" "this" {
  for_each      = var.enable_nat_gateway ? local.nat_gateway_azs : {}
  allocation_id = aws_eip.nat_gateway[each.key].id
  subnet_id     = aws_subnet.public[each.key].id

  tags = {
    Name = "${aws_vpc.this.tags.Name}-${each.key}"
  }
}
```

```bash
$ terraform apply -var='enable_nat_gateway=false'
```

前述の`terraform init -backend-config`で指定してbackend定義をした場合、`data "terraform_remote_state"`ではその時に設定した内容を`-var`で指定した上で`terraform apply`をする必要がある。（指定しないとAccess Deniedやリソースがないなど、必要な情報が不足している事でtfstateが参照できない）

```terraform:data.tf
data "terraform_remote_state" "log_alb" {
  backend = "s3"

  config = {
    bucket = "hoge-credentials"
    key    = "${local.system_name}/${local.env_name}/log/alb_v1.5.0.tfstate"
    region = var.region
  }
}
```

```terraform:variables.tf
variable "region" {
  type = string
  default = "ap-northeast-1"
}
```

```bash
$ terraform plan -var="region=us-east-1"
```

#### 実行計画の確認を無視 -auto-approve
通常`terraform apply`は実行前に実行計画を確認した上で `yes` と入力する必要があるが、その入力が不要になる。`terraform plan`でちゃんと確認するのが大前提だが、検証中などでわかりきった実行計画であればたまに使う。

```bash
$ terraform apply -auto-approve
```

## terraform fmt -recursive
Terraformファイルをフォーマットする。
デフォルトは指定したディレクトリやカレントディレクトリのみが対象だが、`-recursive`をつけるとサブディレクトリを含めてフォーマットがかかる。

```bash
$ terraform fmt -recursive
```
使用するエディターがVSCodeであればTerraformの拡張機能がある。
シンタックスハイライト、サジェスト、フォーマットなど開発を大いに助けてくれる。

https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform




## エイリアスを貼る
いちいち`terraform ~`と書くのが面倒なら開発環境にエイリアスを貼る。
例えば、`devcontainer`を使って開発環境を整えているなら`Dockerfile`に以下のコマンドを追記してエイリアスを貼っておく。

```bash: Dockerfile
    FROM php:8.1.18-fpm-bullseye
    .
    .
    .
    
    # .bash_aliases
    RUN { \
        echo "export LANG=ja_JP.UTF-8"; \
        echo "alias ll='ls -al'"; \
        .
        .
        echo "alias ti='terraform init'"; \
        echo "alias tf='terraform fmt'"; \
        echo "alias tp='terraform plan'"; \
        echo "alias ta='terraform apply'"; \
        echo "alias taf='terraform apply -auto-approve'"; \
        } > /home/vscode/.bash_aliases
```


# その他
## aws-mfa認証
AWS CLI で MFA認証をするコマンド。`aws-mfa`ツールを使う。
```bash
$ aws-mfa --profile app_administrator --device arn:aws:iam::<アカウントID>:mfa/<IAMユーザー名>
```
コマンドが長くいちいち書くのが面倒になりがち。
辞書登録、aliasを貼る、後述の認証とセットでシェルスクリプトを作る、などしておくと良い。

#### aws-mfaインストール
```bash
$ pip3 install aws-mfa --user
```

https://github.com/broamski/aws-mfa

`Credentials File Setup`を参照しながらお作法に則って登録する。

#### 仮想MFAとして使用できるツール例

https://chromewebstore.google.com/detail/authenticator/bhghoamapcdpbohphigoooaddinpkbai?hl=ja&pli=1

そもそもMFA認証を設定していないなら、こちらの記事で手順が紹介されており、非常にわかりやすいので参考にする

https://qiita.com/s_Pure/items/76011e67e9a10c7c195c


## AWS CLI 認証
AWS CLIのセッションの状態を表示するコマンド。（セッションキャッシュを削除して新しいセッションを表示）
```bash
$ rm -rf ~/.aws/cli/cache && aws sts get-caller-identity --profile <profile>
```


# 最後に
IaC開発をすすめる方に幸多からん事を。