こんちには。
データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。
今回は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-vault
はcredentials
を使用しないはずですが念のため)
まずは、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.
まとめ
いかがでしたでしょうか。こちらが皆様の環境設定のお役に立てば幸いです。