Windowsでaws-vaultの設定を最初から実施し、aws-vault経由でterraformの実行テストをしてみた
こんちには。
データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。
今回は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.
まとめ
いかがでしたでしょうか。こちらが皆様の環境設定のお役に立てば幸いです。