はじめに
こんにちは、クラウドエンジニアリング部の本橋です。
私は普段Terraformを使ってAWS検証をしています。 その際、MFAを使用する必要があったためやり方を調べました。
インターネット上にいくつか記事は見かけましたが、自分がやりたいこととは少し違ったので、ここでまとめておきます。
今回やること
タイトルにある通りです。正確には「MFAが有効にされたAWS IAMユーザのAPI keyを利用したTerraformコマンドの実行方法」です。
Terrafromを実行する際、通常であればアクセスキーとシークレットキーを設定することでTerraformの実行が可能になります。
ただセキュリティを考慮するとMFAが成功したときのみ与えられた権限の中でTerraformの実行を許可したいケースがあります。今回はこのケースに対応するための手順をまとめます。
検証環境
- Ubuntu-22.04 (Windows 10でwslを利用)
- aws-cli 2.11.20
- Terraform 1.4.6
前提
- IAM Userが発行されていること
- API keyが作成済みであること
結論
以下が結論です。2回目以降はここから各パラメータを入力するだけでTerraformを実行できるはずです。
# セッションを取得するための認証情報を設定 export AWS_ACCESS_KEY_ID=<アクセスキー> export AWS_SECRET_ACCESS_KEY=<シークレットキー> # 8時間のセッションを取得 account_id=<AWSアカウントID> mfa_name=<MFAデバイス名> token=<MFAデバイスが出力したコード> SESSION_TOKEN="$(aws sts get-session-token --serial-number arn:aws:iam::${account_id}:mfa/${mfa_name} --duration-seconds 28800 --token-code $token)" # terraformが利用する認証情報を設定 export AWS_ACCESS_KEY_ID=$(echo $SESSION_TOKEN | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $SESSION_TOKEN | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $SESSION_TOKEN | jq -r '.Credentials.SessionToken') # terraform実行 terraform plan
作業と説明
IAM UserのMFAデバイス作成
AWSコンソールの「Identity and Access Management (IAM) 」 -> 対象のユーザ -> 「セキュリティ認証情報」タブ -> 「MFA デバイスの割り当て」を選択
自分のMFAデバイスを登録します。私はChromeの拡張機能の「Authenticator」を利用しています。今回は「test-mfa」というデバイス名で作成しました。
セッション情報を取得
セッションを取得するためのアクセスキーとシークレットキーを設定します。
AWSコンソールの「Identity and Access Management (IAM) 」 -> 対象のユーザ -> 「セキュリティ認証情報」タブ -> 「アクセスキーを作成」から作成したアクセスキーになります。今回は前提としているため説明は省略します。
export AWS_ACCESS_KEY_ID=<アクセスキー> export AWS_SECRET_ACCESS_KEY=<シークレットキー>
アクセスキーを設定したら、以下のパラメータを設定します。
account_idには利用しているAWSアカウントID、mfa_nameには先ほど作成したMFAデバイス名、tokenにはMFAデバイスが発行したコードを入れます。
オプション "--duration-seconds" はセッションが有効な時間を秒で指定します(1時間は3600)。この例では8時間(28800)を指定しています。
account_id=<AWSアカウントID> mfa_name=test-mfa token=111111 SESSION_TOKEN="$(aws sts get-session-token --serial-number arn:aws:iam::${account_id}:mfa/${mfa_name} --duration-seconds 28800 --token-code $token)"
Terraform実行
あとは先ほど実行したコマンドの戻り値からTerraform実行用の認証情報を取得して実行するだけです。
export AWS_ACCESS_KEY_ID=$(echo $SESSION_TOKEN | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $SESSION_TOKEN | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $SESSION_TOKEN | jq -r '.Credentials.SessionToken')
Terraform実行
terraform plan
ここまで問題なくできていれば、"terraform plan"コマンドが成功します。
$ terraform plan ... # aws_s3_object.index will be created + resource "aws_s3_object" "index" { + acl = "private" + bucket = (known after apply) + bucket_key_enabled = (known after apply) + content_type = "text/html" + etag = (known after apply) + force_destroy = false + id = (known after apply) + key = "index.html" + kms_key_id = (known after apply) + server_side_encryption = (known after apply) + source = "../files/index.html" + storage_class = (known after apply) + tags_all = (known after apply) + version_id = (known after apply) } Plan: 11 to add, 0 to change, 0 to destroy.
感想
以上です。最後までお読みいただきありがとうございました。
この記事が役に立っていれば幸いです。
おわりに
私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
https://www.ap-com.co.jp/service/utilize-aws/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。