本記事について
最近、Terraformのデプロイを2段階認証ありで行うと手間だったので、簡単にできる方法はないかと調べたところ、aws-vaultを見つけた。aws-vaultを使ってデプロイするとアクセスキーを毎回取ってくる必要はないので非常に楽にデプロイできる。
前提
- 以下インストールされている環境
brew
terraform
aws cli
実行環境
% aws --version
aw-cli/2.7.13 Python/3.10.5 Darwin/21.4.0 source/arm64 prompt/off
% terraform --version
Terraform v1.2.4
on darwin_arm64
% sw_vers
ProductName: macOS
ProductVersion: 12.3.1/
AWS側の設定
デプロイをするためのIAMロールを作成する
デプロイ時に必要な権限を付与したIAMロールを作成しましょう。
選択するのは、「AWSアカウント」 > 「このアカウント」 > 「次へ」
必要な権限を追加し、名前をつけた後に信頼されたエンティティを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account_id>:user/<user_id>"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
ロールが作成できたら、前準備は完了です。
aws-vault実行まで
aws-vaultインストール
% brew install aws-vault
configを設定する
mkdir ~/.aws
vi ~/.aws/config
configを以下のように記載(環境が一個でいい場合はdefaultだけでも大丈夫)
[default]
region=ap-northeast-1
output=json
mfa_serial=arn:aws:iam::<account_id>:mfa/<account_id>
role_arn=arn:aws:iam::<account_id>:role/<AWS側の設定で作成したロール>
[profile test]
region=ap-northeast-1
output=json
mfa_serial=arn:aws:iam::<account_id>:mfa/<account_id>
role_arn=arn:aws:iam::<account_id>:role/<AWS側の設定で作成したロール2>
aws-vaultの設定を行う
上記のようにconfigを記載した後にaws-vault list
コマンドでプロファイルがあるか確認する。
% aws-vault list
Profile Credentials Sessions
======= =========== ========
default - -
test - -
今回はdefaultに設定を反映させたいので以下のコマンドを打ってアクセスキーとシークレットアクセスきーを設定する
% aws-vault add default
Enter Access Key Id: <access_key>
Enter Secret Key: <secret_access_key>
再度aws-vault list
で実行して、Credentialsにdefaultの記載があれば設定完了です。
% aws-vault list
Profile Credentials Sessions
======= =========== ========
default default -
test - -
aws-vaultでs3 listを表示してみる
Terraformコマンド実行の前にs3 ls
でちゃんと動くか確認して見ましょう。
下記コマンドを実行して、エラーが出なければ成功です。
% aws-vault exec default -- aws s3 ls
Enter MFA code for arn:aws:iam::<account_id>:mfa/<user_id>:
Terraformの実行
上記までの手順があればあとは、Terraformのある場所で以下のようにTerraformのinitやapplyができます。
aws-vault exec default -- terraform init
aws-vault exec default -- terraform apply
最後に
まだまだ初学者ですので、間違っていることがあればコメントで教えて下さると大変助かります。
ありがとうございました。