
はじめに
こんにちは、クラウドエンジニアリング部の本橋です。
私は普段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/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。