よく使うTerraformコマンドとAWS CLI認証コマンドをメモります。
環境
terraform v1.5.0
Terraformコマンド
terraform init -backend-config="profile=app_administrator"
リソース定義するときのprofileを設定できる。
個人で持つawsアカウントと組織で使うawsアカウントをそれぞれ使い分けたい時などに使える。(defaultを参照して欲しくない時も同様)
$ terraform init -backend-config="profile=private_app_administrator"
とはいえ、profileだけでなくbackend-config
に指定する値を切り替えることで、複数の展開先にプロビジョニングすることができる。
例えば、一部のattributeはbackendブロックに書いて、書いていないものだけbackend-config
で設定することもできる。
terraform {
backend "s3" {
bucket = "hoge-credentials"
key = "example/prod/app_v1.5.0.tfstate"
# region = "ap-northeast-1" // リージョンをオプションで指定
}
}
$ terraform init -backend-config="region=us-east-1"
terraform apply -var="hoge=fuga"
変数をコマンド実行時に上書きすることができる。
例えば、NATゲートウェイやALBといったサービス定義で、開発中無駄に起動して料金が発生して欲しくない時などに使える。(変数参照してリソース作成を操作)
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}"
}
}
$ terraform apply -var='enable_nat_gateway=false'
前述のterraform init -backend-config
で指定してbackend定義をした場合、data "terraform_remote_state"
ではその時に設定した内容を-var
で指定した上でterraform apply
をする必要がある。(指定しないとAccess Deniedやリソースがないなど、必要な情報が不足している事でtfstateが参照できない)
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
}
}
variable "region" {
type = string
default = "ap-northeast-1"
}
$ terraform plan -var="region=us-east-1"
実行計画の確認を無視 -auto-approve
通常terraform apply
は実行前に実行計画を確認した上で yes
と入力する必要があるが、その入力が不要になる。terraform plan
でちゃんと確認するのが大前提だが、検証中などでわかりきった実行計画であればたまに使う。
$ terraform apply -auto-approve
terraform fmt -recursive
Terraformファイルをフォーマットする。
デフォルトは指定したディレクトリやカレントディレクトリのみが対象だが、-recursive
をつけるとサブディレクトリを含めてフォーマットがかかる。
$ terraform fmt -recursive
使用するエディターがVSCodeであればTerraformの拡張機能がある。
シンタックスハイライト、サジェスト、フォーマットなど開発を大いに助けてくれる。
エイリアスを貼る
いちいちterraform ~
と書くのが面倒なら開発環境にエイリアスを貼る。
例えば、devcontainer
を使って開発環境を整えているなら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
ツールを使う。
$ aws-mfa --profile app_administrator --device arn:aws:iam::<アカウントID>:mfa/<IAMユーザー名>
コマンドが長くいちいち書くのが面倒になりがち。
辞書登録、aliasを貼る、後述の認証とセットでシェルスクリプトを作る、などしておくと良い。
aws-mfaインストール
$ pip3 install aws-mfa --user
Credentials File Setup
を参照しながらお作法に則って登録する。
仮想MFAとして使用できるツール例
そもそもMFA認証を設定していないなら、こちらの記事で手順が紹介されており、非常にわかりやすいので参考にする
AWS CLI 認証
AWS CLIのセッションの状態を表示するコマンド。(セッションキャッシュを削除して新しいセッションを表示)
$ rm -rf ~/.aws/cli/cache && aws sts get-caller-identity --profile <profile>
最後に
IaC開発をすすめる方に幸多からん事を。