LoginSignup
0
0

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

Last updated at Posted at 2024-06-05

よく使う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で設定することもできる。

backend.tf
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といったサービス定義で、開発中無駄に起動して料金が発生して欲しくない時などに使える。(変数参照してリソース作成を操作)

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}"
  }
}
$ terraform apply -var='enable_nat_gateway=false'

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

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
  }
}
variables.tf
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に以下のコマンドを追記してエイリアスを貼っておく。

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開発をすすめる方に幸多からん事を。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0