[小ネタ] AWS Tools for PowerShellの認証情報を移行する

2019.05.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

つい先日故障のため仕事で使っているPCを交換したのですが、その際にAWS Tools for PowerShellのプロファイル情報を移行するのに少しハマったので知見を共有します。

AWS Tools for PowerShellの認証情報

AWS Tools for PowerShellではプロファイルなどの認証情報をユーザープロファイル配下に保存します。
例えばWindowsの既定では[ユーザープロファイル(C:\Users\ユーザー名)]\AppData\Local\AWSToolkit\RegisteredAccounts.jsonに保存されています。

このRegisteredAccounts.jsonは下図の様に内容が暗号化されて保存されています。

認証情報の移行

このRegisteredAccounts.jsonの情報をほかのマシンに移せば認証情報を移行できるはずなのですが、単純にファイルをコピーして移動するだけでは移行できませんでした。
具体的な暗号化方式まではわかりませんでしたがRegisteredAccounts.jsonは別マシンでは復号化できない様です。
(例えば.NET FrameworkのSecureStringクラスもマシンを超えて復号化できないのでAWS Tools for PowerShellもそういうものなのでしょう)

このためAWS Tools for PowerShellの認証情報を別マシンに移行するにはひと手間かけてやる必要があります。

認証情報の復号化

当たりといえば当たり前ですが、AWS Tools for PowerShellに保存されている認証情報は同一マシン内であれば復号可能です。
Get-AWSCredentialコマンドレットを使うとAmazon.Runtime.BasicAWSCredentials型の認証情報が取得でき、このクラスにはGetCredentials()メソッドがあり、これを使うと保存されているアクセスキーやシークレットキーの中身を参照することができます。

# プロファイルに登録されている情報を参照する例
$awsCred = Get-AWSCredential -ProfileName "プロファイル名"
$awsCred.GetCredentials()

これを応用し、以下の様にすると端末に登録されているすべてのプロファイルのアクセスキーとシークレットキーを取得することができます。

Get-AWSCredential -ListProfileDetail | ForEach-Object {
    $cred = (Get-AWSCredential -ProfileName $_.ProfileName).GetCredentials()
    [PSCustomObject]@{
        ProfileName = $_.ProfileName
        AccessKey = $cred.AccessKey
        SecretKey = $cred.SecretKey
    }
}

認証情報を移行する

ここまでわかればもうひと工夫して以下の様にすると取得した認証情報を再登録するSet-AWSCredentialコマンドレットのコマンドラインを自動生成することができます。

Get-AWSCredential -ListProfileDetail | ForEach-Object {
    $cred = (Get-AWSCredential -ProfileName $_.ProfileName).GetCredentials()
    ("Set-AWSCredential -AccessKey {0} -SecretKey {1} -StoreAs {2}" -f $cred.AccessKey, $cred.SecretKey, $_.ProfileName)
}

このコマンド文字列を移行先のマシンで実行すれば無事認証情報を移行することができます。

# 出力されたコマンド文字列移行先マシンで実行して認証情報を移行する
Set-AWSCredential -AccessKey AKI123456789 -SecretKey asdfghjklkkhhiu -StoreAs test-profile1
Set-AWSCredential -AccessKey AKI223456789 -SecretKey wertyuiop@egete -StoreAs test-profile2
Set-AWSCredential -AccessKey AKI323456789 -SecretKey cxvbnmyuhjkl6uk -StoreAs test-profile3

最後に

ざっとこんな感じで認証情報を移行できます。
環境によってはコマンドライン文字列の生成をもう少し頑張る必要があるかもしれませんがさほど難しいことにはならないでしょう。

本記事の内容が誰かの役に立てば幸いです。