

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# PowerShell を使用して AWS IAM アイデンティティセンターから AWS CLI 認証情報を更新
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell"></a>

*Amazon Web Services、Chad Miles と Andy Bowen*

## 概要
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell-summary"></a>

AWS IAM アイデンティティセンター (AWS シングルサインオンの後継) 認証情報を、AWS コマンドラインインターフェイス (AWS CLI)、AWS SDK、または AWS Cloud Development Kit (AWS CDK) と共に使用する場合、通常、IAM アイデンティティセンターコンソールからコマンドラインインターフェイスに認証情報をコピーして貼り付ける必要があります。このプロセスにはかなりの時間がかかることがあり、アクセスが必要なアカウントごとに繰り返す必要があります。

１つの一般的な解決策は、AWS CLI `aws sso configure` コマンドを使用することです。このコマンドにより、IAM アイデンティティセンターで有効にされたプロファイルを AWS CLI または AWS SDK に追加します。ただし、このソリューションの欠点は、このように設定した AWS CLI プロファイルまたはアカウントごとにコマンド `aws sso login` を実行する必要があることです。

代替ソリューションとして、このパターンでは、AWS CLI 「[名前付きプロファイル](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles)」と AWS Tools for PowerShell を使用して、単一の IAM アイデンティティセンターのインスタンスから複数のアカウントの認証情報を同時に保存および更新する方法を説明します。また、このスクリプトは IAM アイデンティティセンターセッションデータをメモリに保存するので、IAM アイデンティティセンターに再度ログインしなくても認証情報を更新します。

## 前提条件と制限
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell-prereqs"></a>

**前提条件**
+ PowerShell がインストールされ、設定されています。詳細については、「[PowerShellをインストール](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell?view=powershell-7.3)」 (Microsoft のドキュメント)を参照してください。
+ AWS Tools for PowerShell がインストールされ、設定されました。パフォーマンスの理由で、モジュール化された AWS Tools for PowerShell バージョンをインストールすることを強く推奨します。 `AWS.Tools` と呼びます。各AWSサービスが、それ自身の個別の小さなモジュールによって適用されます。PowerShell プロンプトで、このパターンに必要なモジュールをインストールするためのコマンド `AWS.Tools.Installer` 、 `SSO` 、および `SSOIDC` を入力します。

  ```
  Install-Module AWS.Tools.Installer
  Install-AWSToolsModule SSO, SSOOIDC
  ```

  詳細については、「[Windows で AWS.Tools をインストール](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up-windows.html#ps-installing-awstools)」 または 「[Linux または macOS で AWS.Tools をインストール](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up-linux-mac.html#install-aws.tools-on-linux-macos)」 を参照してください。
+ AWS CLI または AWS SDK は、以下のいずれかを実行して、あらかじめ有効な認証情報を使用して設定する必要があります：
  + AWS CLIの`aws configure` コマンドを使用します。詳細については、「[クィック設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)」（AWS CLI 文書）を参照してください。
  + IAM ロールを通じて一時的なアクセスを取得するように 、AWS CLI または AWS CDK を設定します。詳細については、「[CLI アクセスの IAM ロール認証情報を取得](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtogetcredentials.html)」(IAM アイデンティティセンタードキュメント) を参照してください。

**制限事項**
+ このスクリプトは、パイプラインまたは完全自動化ソリューションに使用できません。このスクリプトをデプロイする場合、IAM アイデンティティセンターからのアクセスを手動で承認する必要があります。その後、スクリプトは自動的に続行されます。

**製品バージョン**
+ すべてのオペレーティングシステムでは、「[PowerShell バージョン 7.0](https://github.com/powershell/powershell)」 以降を使用することを推奨します。

## アーキテクチャ
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell-architecture"></a>

このパターンでスクリプトを使用して、複数の IAM センターの認証情報を同時に更新できます。また、AWS CLI、AWS SDK、または AWS CDK で使用する認証情報ファイルを作成できます。

![\[AWS CLI、AWS CDK、または AWS SKD の認証情報を更新するには、PowerShell スクリプトを使用します。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/6d54a6bb-01ac-4736-9b78-40921fcc9056/images/01e0fcb6-3b48-422c-8868-07a7de83b3e3.png)


## ツール
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell-tools"></a>

**AWS サービス**
+ 「[AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。
+ 「[AWS IAM アイデンティティセンター](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)」 により、すべての AWS アカウントとクラウドアプリケーションへのシングルサインオン (SSO) アクセスを一元管理できます。
+ 「[AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-welcome.html)」 は PowerShell のコマンドラインから AWS リソースの操作をスクリプト処理することを支援する PowerShell モジュールのセットです。

**その他のツール**
+ 「[PowerShell](https://learn.microsoft.com/en-us/powershell/)」 は Windows、Linux、および macOS で動作するMicrosoft の自動化および構成管理プログラムです。

## ベストプラクティス
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell-best-practices"></a>

このスクリプトは、各 IAM アイデンティティセンターのインスタンスに対して 1 つずつ保留します。1 つのスクリプトを複数のインスタンスに使用することは適用されません。

## エピック
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell-epics"></a>

### SSO スクリプトを実行する
<a name="run-the-sso-script"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| SSO スクリプトをカスタマイズします。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell.html) | クラウド管理者 | 
| 実行するスクリプト。 | PowerShell シェルで次のコマンドを使用してカスタムスクリプトを実行することを推奨します。<pre>./Set-AwsCliSsoCredentials.ps1</pre>代りに、次のコマンドを入力して、別のシェルからスクリプトを実行できます。<pre>pwsh Set-AwsCliSsoCredentials.ps1</pre> | クラウド管理者 | 

## トラブルシューティング
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| `No Access` エラー | 使用している IAM ロールには、`RoleName`のパラメータで定義したロールまたは権限セットにアクセスする権限がありません。使用しているロールの権限を更新するか、スクリプトで別のロールまたは権限セットを定義します。 | 

## 関連リソース
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell-resources"></a>
+ [構成設定はどこに保存されていますか?](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-where) （AWS CLI ドキュメント）
+ 「[AWS IAM IM アイデンティティセンターを使用するための AWS CLI の設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html)」 (AWS CLI ドキュメント)
+ 「[名前付きプロファイルを使用](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles)」 (AWS CLI ドキュメント)

## 追加情報
<a name="update-aws-cli-credentials-from-aws-iam-identity-center-by-using-powershell-additional"></a>

**SSO スクリプト**

次のスクリプトでは、山括弧 (<>) 内のプレースホルダーを独自の情報に置き換えたら、山括弧を削除します。

```
Set-AwsCliSsoCredentials.ps1
Param(
    $DefaultRoleName = '<AWSAdministratorAccess>',
    $Region          = '<us-west-2>',
    $StartUrl        = "<https://d-12345abcde.awsapps.com/start/>",
    $EnvironmentName = "<CompanyName>"
) 
Try {$SsoAwsAccounts = (Get-Variable -name "$($EnvironmentName)SsoAwsAccounts" -Scope Global -ErrorAction 'SilentlyContinue').Value.Clone()} 
Catch {$SsoAwsAccounts = $False}
if (-not $SsoAwsAccounts) { $SsoAwsAccounts = @(    
# Add your account information in the list of hash tables below, expand as necessary, and do not forget the commas 
    @{Profile = "<Account1>"      ; AccountId = "<012345678901 >"; RoleName = $DefaultRoleName },
    @{Profile = "<Account2>"      ; AccountId = "<123456789012>"; RoleName = "<AWSReadOnlyAccess>" }
)}
$ErrorActionPreference = "Stop"
if (-not (Test-Path ~\.aws))      { New-Item ~\.aws -type Directory }
if (-not (Test-Path ~\.aws\credentials)) { New-Item ~\.aws\credentials -type File }
$CredentialFile = Resolve-Path ~\.aws\credentials 
$PsuedoCreds    = @{AccessKey = 'AKAEXAMPLE123ACCESS';SecretKey='PsuedoS3cret4cceSSKey123PsuedoS3cretKey'} # Pseudo Creds, do not edit.
Try {$SSOTokenExpire = (Get-Variable -Scope Global -Name "$($EnvironmentName)SSOTokenExpire" -ErrorAction 'SilentlyContinue').Value} Catch {$SSOTokenExpire = $False}
Try {$SSOToken       = (Get-Variable -Scope Global -Name "$($EnvironmentName)SSOToken" -ErrorAction 'SilentlyContinue').Value }      Catch {$SSOToken       = $False}
if ( $SSOTokenExpire -lt (Get-Date) ) {
    $SSOToken = $Null
    $Client   = Register-SSOOIDCClient -ClientName cli-sso-client -ClientType public -Region $Region @PsuedoCreds
    $Device   = $Client | Start-SSOOIDCDeviceAuthorization -StartUrl $StartUrl -Region $Region @PsuedoCreds
    Write-Host "A Browser window should open. Please login there and click ALLOW." -NoNewline
    Start-Process $Device.VerificationUriComplete
    While (-Not $SSOToken){
        Try {$SSOToken = $Client | New-SSOOIDCToken -DeviceCode $Device.DeviceCode -GrantType "urn:ietf:params:oauth:grant-type:device_code" -Region $Region @PsuedoCreds}
        Catch {If ($_.Exception.Message -notlike "*AuthorizationPendingException*"){Write-Error $_.Exception} ; Start-Sleep 1}
    }
    $SSOTokenExpire = (Get-Date).AddSeconds($SSOToken.ExpiresIn)
    Set-Variable -Name "$($EnvironmentName)SSOToken" -Value $SSOToken -Scope Global
    Set-Variable -Name "$($EnvironmentName)SSOTokenExpire" -Value $SSOTokenExpire -Scope Global
}
$CredsTime     = $SSOTokenExpire - (Get-Date)
$CredsTimeText = ('{0:D2}:{1:D2}:{2:D2} left on SSO Token' -f $CredsTime.Hours, $CredsTime.Minutes, $CredsTime.Seconds).TrimStart("0 :")
for ($i = 0; $i -lt $SsoAwsAccounts.Count; $i++) {
    if (([DateTimeOffset]::FromUnixTimeSeconds($SsoAwsAccounts[$i].CredsExpiration / 1000)).DateTime -lt (Get-Date).ToUniversalTime()) {
        Write-host "`r                                                                     `rRegistering Profile $($SsoAwsAccounts[$i].Profile)" -NoNewline
        $TempCreds = $SSOToken | Get-SSORoleCredential -AccountId $SsoAwsAccounts[$i].AccountId -RoleName $SsoAwsAccounts[$i].RoleName -Region $Region @PsuedoCreds
        [PSCustomObject]@{AccessKey = $TempCreds.AccessKeyId; SecretKey = $TempCreds.SecretAccessKey; SessionToken = $TempCreds.SessionToken
        } | Set-AWSCredential -StoreAs $SsoAwsAccounts[$i].Profile -ProfileLocation $CredentialFile 
        $SsoAwsAccounts[$i].CredsExpiration = $TempCreds.Expiration
    }
} 
Set-Variable -name "$($EnvironmentName)SsoAwsAccounts" -Value $SsoAwsAccounts.Clone() -Scope Global
Write-Host "`r$($SsoAwsAccounts.Profile) Profiles registered, $CredsTimeText"
```