APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

MFAを有効化したTerraformの実行方法 (AWS)

はじめに

こんにちは、クラウドエンジニアリング部の本橋です。
私は普段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/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: 本橋
AWSを活用したインフラ系のご支援を担当しています。