Windowsでaws-vaultの設定を最初から実施し、aws-vault経由でterraformの実行テストをしてみた

Windowsでaws-vaultの設定を最初から実施し、aws-vault経由でterraformの実行テストをしてみた

Clock Icon2023.08.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんちには。

データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。

今回はWindowsマシンに対して、以下記事に沿ってaws-vaultの設定をしてterraformの実行まで確認しましたので、その作業メモをブログにしました。

本記事の設定は以下の則っています。aw-vaultについての説明はこれらの記事もご参考にされてください。

aws-vaultのインストール

Windowsマシンからの実行であるため、PowerShellを管理者権限で起動して以下でaws-vaultをインストールします。

choco install aws-vault

環境毎にインストール方法は異なりますので以下を参照ください。

インストール後は、恒例のバージョンチェックをしてみます。

aws-vault --version

# v7.2.0

aws-vaultの設定と~/.aws/configの設定

~/.aws/config~/.aws/credentialsは存在しない状態で開始します。

(実際にはバックアップをしています。またaws-vaultcredentialsを使用しないはずですが念のため)

まずは、classmethodという名前でスイッチロール元のプロファイルを設定します。

(名前は任意で設定可能)

aws-vault add classmethod

# Enter Access Key ID: XXXX
# Enter Secret Access Key: ****************************************
# Added credentials to profile "classmethod" in vault

プロファイルの登録を確認します。

aws-vault list

# Profile                  Credentials              Sessions
# =======                  ===========              ========
# classmethod              classmethod              -

この時点で~/.aws/configは以下のように空欄で作成されています。

[profile classmethod]

ここに以下のようにこちらの記事と同様の設定を追記します。

[profile classmethod]
mfa_serial=arn:aws:iam::<スイッチロール元のアカウントID>:mfa/<スイッチロール元のIAMユーザ名>
region=ap-northeast-1
output=json

[profile common]
credential_process=aws-vault --prompt terminal export classmethod --duration 12h --format=json

[profile myproject1]
source_profile=common
role_arn=arn:aws:iam::<スイッチロール先1のアカウントID>:role/<ロール名>
region=ap-northeast-1
output=json

[profile myproject2]
source_profile=common
role_arn=arn:aws:iam::<スイッチロール先2のアカウントID>:role/<ロール名>
region=ap-northeast-1
output=json

ロールセッション名が必要な場合はrole_session_nameも設定されてください。

この編集後は、以下のようにprofileが認識されます。

aws-vault list

# Profile                  Credentials              Sessions
# =======                  ===========              ========
# classmethod              classmethod              -
# common                   -                        -
# myproject1               -                        -
# myproject2               -                        -

aws-vaultの実行

セッションをクリアします。

aws-vault clear

スイッチロール先1でAWS CLIを実行してみます。

aws --profile myproject1 sts get-caller-identity

# Enter MFA code for arn:aws:iam::<スイッチロール元のアカウントID>:mfa/<スイッチロール元のIAMユーザ名>: <MFAコード>
# {
#     "UserId": "XXXXXXXXXXXXXXXXXXXXX:<ロールセッション名>",
#     "Account": "<スイッチロール先1のアカウントID>",
#     "Arn": "arn:aws:sts::<スイッチロール先1のアカウントID>:assumed-role/<ロール名>/<ロールセッション名>"
# }

MFAコードの入力が求められますので入力します。

一度入力すると、以下のようにスイッチロール先2でもMFAコードの再入力は求められなくなります。

aws --profile myproject2 sts get-caller-identity

# {
#     "UserId": "XXXXXXXXXXXXXXXXXXXXX:<ロールセッション名>",
#     "Account": "<スイッチロール先1のアカウントID>",
#     "Arn": "arn:aws:sts::<スイッチロール先1のアカウントID>:assumed-role/<ロール名>/<ロールセッション名>"
# }

現在の状態を以下で確認できます。12時間セッショントークンが有効となっていることが分かります。

(これはcommonプロファイルで--duration 12hとしているため)

aws-vault list

# Profile                  Credentials              Sessions
# =======                  ===========              ========
# classmethod              classmethod              sts.GetSessionToken:11h51m2s
# common                   -                        -
# myproject1               -                        -
# myproject2               -                        -

terraform実行の確認

最後にaws-vault経由でterraformを実行します。

以下のようなmain.tfファイルを任意のディレクトリに作成します。

resource "aws_s3_bucket" "sample-bucket" {
  bucket = "バケット名"
}

terraform initを実行します。

terraform init

# Initializing the backend...
#
# (...中略...)
#
# If you ever set or change modules or backend configuration for Terraform,
# rerun this command to reinitialize your working directory. If you forget, other
# commands will detect it and remind you to do so if necessary.

applyで実際にS3バケットを作成します。(実際はplanなどをその前に挟んでもよいです)

aws-vault exec myproject1 -- terraform apply

# (...中略...)
#
#  Enter a value: yes
#
# (...中略...)
#
# Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

無事作成を確認し終わったら、destroyします。

aws-vault exec myproject1 -- terraform destroy

# (...中略...)
#
#  Enter a value: yes
#
# (...中略...)
#
# Destroy complete! Resources: 1 destroyed.

まとめ

いかがでしたでしょうか。こちらが皆様の環境設定のお役に立てば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.