
WindowsのPowerShell上で、Aws-Vaultと1Password CLIを利用してMFAの自動入力する仕組みを導入してみた
はじめに
データ事業本部の太田です。
皆さんはAWSでの開発を行っているでしょうか?私は日常的に行っております。
そこで直面する課題として、AWS CLIやSDKを用いた際、実行時にセッションが切れるたびに毎回MFAの入力が求められることです。
セキュリティの観点上致し方ないことではありますが、毎回MFAコードを確認して入力する手間って、積み重なると結構な時間になるなと思い、なんとか自動化できないかなと日ごろから考えていました。
調べていくと、AWS-Vaultと1Password CLIを組み合わせることで、MFAコードの入力を自動化できることがわかりました。
ただ、ネット上を探してもWindowsのPowerShell上でAWS CLIやSDKを使用する際に、MFAの認証を自動で入力してくれるセットアップに関する記事を見つけることができませんでした。
(Macでのセットアップについては、やまたつさんやのんピさんの記事が参考になるかと思います。)
また、調査していくと、同様の事象に遭遇したkariyaさんが、Windows上でAWS-Vaultが実行できない旨をOSSのIssue報告されている記事を見つけることができました。
こちらのIssueについて、最近行われたv7.5.2のアップデートで、Windowsで実行できないバグが解消されたとのリリースノートを発見することができたので、これは試すしかないと思い、実際にWindows上でセットアップを行ってみました。
本記事は、その際に行ったセットアップの手順をまとめた内容となっております。
導入環境について
前提として、AWS CLI
と1Password for Windows
はインストール済みであることとします。
また、AWSアカウントのアクセスキーとシークレットアクセスキーも発行済みである必要があります。
今回セットアップを行った私が使用しているWindows環境は以下記載しておりますので、参考にしてください。
- OS:
Windows 11 Pro 23H2
- ターミナル:
PowerShell 7.5.2
- AWS CLI :
aws-cli/2.22.31 Python/3.12.6 Windows/11 exe/AMD64
- 1Password for Windows :
8.11.0
実施する内容
今回実装する内容は以下の通りです。
- 1Password CLIのセットアップ
- AWS-Vaultのセットアップ
- AWSのクレデンシャルとプロファイルの設定
- 実際にAWS CLIコマンドを実行してみた
実際にやってみた
では、早速セットアップをしていきましょう。
1. 1Password CLIのセットアップ
1Password CLIの設定方法は、以下の公式ドキュメントに詳しく記載されています。
こちらの内容に沿って、セットアップを行っていきます。
1Password CLIのインストール
まずは、1Password CLIのインストールを行っていきます。
今回はWindowsでのセットアップになるので、winget
を使用した方法で実行します。
PS C:\Users\ota.ryoichi> winget install 1password-cli
見つかりました 1Password CLI [AgileBits.1Password.CLI] バージョン 2.31.1
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
ダウンロード中 https://cache.agilebits.com/dist/1P/op2/pkg/v2.31.1/op_windows_amd64_v2.31.1.zip
██████████████████████████████ 8.66 MB / 8.66 MB
インストーラーハッシュが正常に検証されました
アーカイブを展開しています...
アーカイブが正常に展開されました
パッケージのインストールを開始しています...
パス環境変数が変更されました; 新しい値を使用するにはシェルを再起動してください。
コマンド ライン エイリアスが追加されました: "op"
インストールが完了しました
以下のコマンドを実行してバージョンが表示されれば、インストールが完了しています。
PS C:\Users\ota.ryoichi> op --version
2.31.1
1Passwordアプリとの連携
続いて、1Passwordアプリとの連携を行い、コマンドライン上で1Passwordのサインインができる状態にします。
1Passwordアプリを起動させた状態でショートカットのctrl + ,
で設定ウィンドウを表示させます。
表示されるタブの開発者
をクリックし、1Password CLIと連携
にチェックを入れることで設定は完了です。
1Passwordのアカウントのサインイン
最後に1Password CLIのコマンドを入力し、1Passwordのユーザのサインインを行います。
ここでは、Vaultの一覧を表示させるコマンドを入力し、アクセスリクエストの認証を行います。
PS C:\Users\ota.ryoichi> op vault list
私の場合はWindows Hello認証の設定を行っているため、顔認証での認証を行いましたが、設定していない場合はパスワード入力でも問題ありません。
認証が完了後、以下のようにVaultの一覧が表示されれば、OKです。
(表示された内容はマスキングしております。)
PS C:\Users\ota.ryoichi> op vault list
ID NAME
*********************** *********
*********************** [**]***-***
*********************** [**]***-****
2. AWS-Vaultのセットアップ
1Password CLIの導入が完了したため、続いてAWS-Vaultの設定を行っていきます。
AWS-VaultはGitHub上のページにて、インストール方法が記載されています。
ここで注意点ですが、どうやらAWS-Vaultにもいくつか種類があるようで、ByteNessが発行するものや99designsが発行するものが確認できました。両方試してみたのですが、少なくとも現時点のWindows PowerShellに関しては、ByteNess
版のほうでのみ動作が確認できたため、インストールする際は注意が必要です。
ここからは、ByteNess
版のAWS Vaultのセットアップを行っていきます。
AWS-Vaultアプリケーションのダウンロード
以下のページにある最新のリリースノートから、Windows用のアプリケーションファイルをダウンロードします。
バージョンがv7.5.2
以上であることを確認のうえ、ご自身の環境に合うexeファイルをダウンロードしてきます。
ダウンロード完了後、ファイル名をわかりやすい名前に変更します。
私の場合はaws-vault.exe
に変更しました。
AWS-Vaultの環境変数にパスを通すためのフォルダを作成
ダウンロードしてきたexeファイルを管理するためのフォルダを作成し、そのフォルダ配下にexeファイルを移動させます。
以下のコマンドを実行し、環境変数用のPATHを通すフォルダとしてTools
フォルダを作成します。
ご自身で管理されているPATH用のフォルダがあるようでしたら、本作業は割愛してかまいません。
PS C:\Users\ota.ryoichi> New-Item -ItemType Directory -Path "C:\Users\ota.ryoichi\Tools"
ディレクトリ: C:\Users\ota.ryoichi\Tools
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2025/07/21 16:48 Tools
ダウンロード後に、リネームしたファイルを先ほど作成したTools
フォルダ配下に移動させます。ダウンロードファイルの格納先をデフォルトから変更している方は指定するPathを変更して実行してください。
PS C:\Users\ota.ryoichi> Move-Item -Path "C:\Users\ota.ryoichi\Downloads\aws-vault.exe" -Destination "C:\Users\ota.ryoichi\Tools\aws-vault.exe"
AWS-Vaultの環境変数のパスを通す
最後に環境変数Pathの設定を行います。
Windows検索で環境変数を編集
と入力し、システム環境変数の編集
を開きます。
ユーザー環境変数
のPath
を選択して、編集
をクリックします。
(複数のユーザ間で共有する場合は、システム環境変数
のPath
で設定してください。)
新規
から先ほど作成したC:\Users\ota.ryoichi\Tools
を追加し、OKをすべて押して閉じます。
PowerShellを再起動し、以下のコマンドを実行して環境変数のパス一覧を表示します。
表示された内容に先ほど設定したフォルダの内容が表示されれば、パスの設定は完了です。
PS C:\Users\ota.ryoichi> $env:PATH -split ';'
C:\Users\ota.ryoichi\Tools
PATHの設定が完了後、以下のコマンドを入力し、バージョンが表示されればOKです。
PS C:\Users\ota.ryoichi> aws-vault --version
v7.5.3
3. AWSのクレデンシャルとプロファイルの設定
最後にAWS-Vault上の設定とconfigファイルの記載の設定していきます。
ここではMFAを自動入力するための設定しか行いませんが、AWS-Vaultの使い方については、かとうさおりさんの以下の記事が参考になります。
IAMユーザアクセスキーの登録
以下のコマンドを実行し、登録したいプロファイル名を指定して、IAMユーザ用に発行したアクセスキーとシークレットキーを入力します。今回はclassmethod
というプロファイル名で作成しようと思います。
PS C:\Users\ota.ryoichi> aws-vault add classmethod
Enter Access Key ID: AKIAIOSFODNN7EXAMPLE
Enter Secret Access Key: ****************************************
Added credentials to profile "classmethod" in vault
無事登録が完了すると、以下のコマンド実行後にプロファイルの表示とクレデンシャル情報が設定されていることが確認できます。
PS C:\Users\ota.ryoichi> aws-vault ls
Profile Credentials Sessions
======= =========== ========
classmethod classmethod -
IAMロールの設定
次に、先ほどクレデンシャルの情報を設定したプロファイルを使用して、IAMユーザ及びAssumeロールの設定を行います。
aws configure
コマンド実施後に作成される~.aws\config
を、以下の内容に沿って編集します。
[profile classmethod]
region=ap-northeast-1
output=json
mfa_serial=arn:aws:iam::{IAMユーザのアカウントID}:mfa/{IAMユーザ名}
mfa_process=op item get Amazon --otp
role_session_name={IAMユーザ名}
[profile classmethod-credential]
credential_process=aws-vault --prompt terminal export classmethod --duration 12h --format=json
[profile cm]
region=ap-northeast-1
source_profile=classmethod-credential
role_arn=arn:aws:iam::{Assumeロール先のアカウントID}:role/{IAMロール名}
ここで設定した内容について、いくつかポイントがあるので記載します。
mfa_process=op item get {Vault名} --otp
[profile classmethod]
句で設定しているmfa_process
では、1Password CLIのコマンドであるop item get
を使用してます。getの指定には、1Password上で管理されているAWSアカウントのVaultの名称を入力してください。
私はAmazon
と設定していたので、そちらを記載しております。
また、--otp
オプションを選択することで、Vaultの中からワンタイムパスワードの値を取得することができます。
詳細は、以下の公式ドキュメントに記載しておりますので、ご参考ください。
[profile classmethod-credential]
credential_process=aws-vault --prompt terminal export {IAMユーザのプロファイル名} --duration 12h --format=json
[profile classmethod-credential]
句では、先ほど設定したaws-vault add
コマンドの内容をもとに、AWS-VaultのコマンドでクレデンシャルとMFAの情報を取得します。export
では、コマンドで設定を行ったIAMユーザのプロファイル名を指定します。
[profile cm]
region=ap-northeast-1
source_profile={クレデンシャル情報が設定されたプロファイル名}
role_arn=arn:aws:iam::{Assumeロール先のアカウントID}:role/{IAMロール名}
最後に[profile cm]
句では、Assumeロール先のIAMロールの設定を行っています。source_profile
に先ほどのクレデンシャルの情報を取得したプロファイル名を指定することで、Assumeロール先にも同じ情報が引き継ぐことが可能です。
このようにすることで、今後Assumeロール先が増えた場合でも、[profile cm]
句をコピーし、profile名称とrole_arn
の内容を追加したいAssumeロールの情報に変更するだけで、手軽に追加することができます。
ここまでで、必要なセットアップは完了です。
お疲れ様でした!
4. 実際にAWS CLIコマンドを実行してみた
セットアップが完了したので、早速CLIコマンドを叩いて、MFAコードの入力が自動で行われるかの確認してみましょう。
先ほど設定を行ったプロファイルを使用して、S3のバケットのリストを取得してみたいと思います。
PS C:\Users\ota.ryoichi > aws s3 ls --profile cm
実行後、1Passwordのアクセスリクエストが表示されます。
1Password CLIの認証と同様に、表示された内容に従って認証を行います。
認証の完了後、コマンドライン上で求められるMFAの入力のメッセージは表示されずに、裏側でMFAの入力処理が行われるようになります。
少し経つと、CLIコマンドの実行結果が表示されるようになります。
PS C:\Users\***> aws s3 ls --profile cm
2024-11-12 12:37:44 ************-ap-northeast-1-athena-results-bucket-**********
2024-11-12 13:07:07 ****-********-output
2025-05-28 10:28:10 ****-***-cdk-deploy-bucket
無事、MFAを入力することなく、Powersehll上でAWS CLIのコマンドの実行ができました。
最後に
いかがだったでしょうか?
WindowsのPowerShellにおいても、AWS-Vaultと1Password CLIを組み合わせることで、快適かつセキュアにAWS開発ができる環境が実現しました。
私の所感にはなりますが、こちらの設定を行ったおかげで、MFAの入力を求められるタイムロスや作業中のノイズを軽減することができ、導入する前に比べて快適に開発を行うことができております。
本記事が、AWSの開発を行うWindowsユーザの方の参考になれば幸いです。