Perbarui kredensyal AWS CLI dari AWS IAM Identity Center dengan menggunakan PowerShell - AWS Prescriptive Guidance

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Perbarui kredensyal AWS CLI dari AWS IAM Identity Center dengan menggunakan PowerShell

Cad Miles dan Andy Bowen, Amazon Web Services

Ringkasan

Jika Anda ingin menggunakan kredensil AWS IAM Identity Center (penerus AWS Single Sign-On) dengan AWS Command Line Interface (AWS CLI), AWS, atau AWS Cloud Development Kit ( SDKsAWS CDK), Anda biasanya harus menyalin dan menempelkan kredensional dari konsol IAM Identity Center ke antarmuka baris perintah. Proses ini dapat memakan waktu yang cukup lama dan harus diulang untuk setiap akun yang memerlukan akses.

Salah satu solusi umum adalah dengan menggunakan perintah AWS CLIaws sso configure. Perintah ini menambahkan profil yang diaktifkan IAM Identity Center ke AWS CLI atau AWS SDK Anda. Namun, kelemahan dari solusi ini adalah Anda harus menjalankan perintah aws sso login untuk setiap profil AWS CLI atau akun yang telah Anda konfigurasikan dengan cara ini.

Sebagai solusi alternatif, pola ini menjelaskan cara menggunakan profil bernama AWS CLI dan AWS Tools untuk menyimpan dan menyegarkan kredensil PowerShell untuk beberapa akun dari satu instans Pusat Identitas IAM secara bersamaan. Skrip ini juga menyimpan data sesi Pusat Identitas IAM di memori untuk menyegarkan kredensyal tanpa masuk ke Pusat Identitas IAM lagi.

Prasyarat dan batasan

Prasyarat

  • PowerShell, diinstal dan dikonfigurasi. Untuk informasi selengkapnya, lihat Menginstal PowerShell (dokumentasi Microsoft).

  • AWS Tools untuk PowerShell, diinstal, dan dikonfigurasi. Untuk alasan kinerja, kami sangat menyarankan Anda menginstal AWS Tools versi termodulasi untuk PowerShell, yang disebut. AWS.Tools Setiap layanan AWS didukung oleh modul kecil individualnya sendiri. Dalam PowerShell prompt, masukkan perintah berikut untuk menginstal modul yang diperlukan untuk pola ini:AWS.Tools.Installer,SSO, danSSOIDC.

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

    Untuk informasi selengkapnya, lihat Menginstal AWS.Tools di Windows atau Menginstal AWS.Tools di Linux atau macOS.

  • AWS CLI atau AWS SDK harus dikonfigurasi sebelumnya dengan kredensyal kerja dengan melakukan salah satu hal berikut:

Batasan

  • Skrip ini tidak dapat digunakan dalam pipeline atau solusi yang sepenuhnya otomatis. Ketika Anda menyebarkan skrip ini, Anda harus secara manual mengotorisasi akses dari IAM Identity Center. Script kemudian berlanjut secara otomatis.

Versi produk

  • Untuk semua sistem operasi, disarankan agar Anda menggunakan PowerShell versi 7.0 atau yang lebih baru.

Arsitektur

Anda dapat menggunakan skrip dalam pola ini untuk menyegarkan beberapa kredensional Pusat Identitas IAM secara bersamaan, dan Anda dapat membuat file kredensi untuk digunakan dengan AWS CLI, AWS, atau SDKs AWS CDK.

Menggunakan PowerShell skrip untuk memperbarui kredensyal di AWS CLI, AWS CDK, atau AWS. SKDs

Alat

Layanan AWS

  • AWS Command Line Interface (AWS CLI) adalah alat sumber terbuka yang membantu Anda berinteraksi dengan layanan AWS melalui perintah di shell baris perintah Anda.

  • AWS IAM Identity Center membantu Anda mengelola akses masuk tunggal (SSO) secara terpusat ke semua akun AWS dan aplikasi cloud Anda.

  • AWS Tools for PowerShell adalah sekumpulan PowerShell modul yang membantu Anda menjalankan skrip pada sumber daya AWS Anda dari baris PowerShell perintah.

Alat-alat lainnya

  • PowerShelladalah program manajemen otomatisasi dan konfigurasi Microsoft yang berjalan di Windows, Linux, dan macOS.

Praktik terbaik

Simpan satu salinan skrip ini untuk setiap instance IAM Identity Center. Menggunakan satu skrip untuk beberapa instance tidak didukung.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Sesuaikan skrip SSO.

  1. Salin skrip SSO di bagian Informasi tambahan.

  2. Di Param bagian ini, untuk lingkungan AWS Anda, tentukan nilai untuk variabel berikut:

    • DefaultRoleName— Peran IAM atau izin ditetapkan untuk digunakan secara default.

    • Region— Wilayah AWS tempat Pusat Identitas IAM digunakan. Untuk daftar lengkap Wilayah dan kodenya, lihat Titik akhir Regional.

    • StartUrl— URL yang digunakan untuk mengakses halaman login IAM Identity Center Anda. Gunakan format yang sama dengan nilai contoh dalam skrip.

    • EnvironmentName— Nama pendek untuk mereferensikan salinan skrip ini, yang akan digunakan saat Anda menjalankan beberapa salinan skrip dalam sesi yang sama.

  3. Di bawah baris 10, yang berbunyi# Add your Account Information, edit nilai-nilai berikut dalam tabel hash untuk mencerminkan lingkungan Anda:

    • Profile— Nama profil AWS CLI untuk menyimpan kredensyal sementara.

    • AccountId— ID akun AWS tempat Anda mengambil kredensialnya.

    • RoleName— Nama peran IAM Identity Center atau set izin yang ingin Anda gunakan. Anda dapat membiarkan ini $DefaultRoleName seolah-olah Anda ingin menggunakan peran yang sama yang Anda tentukan di Param bagian ini.

    Setiap baris dalam tabel hash harus diakhiri dengan koma kecuali yang terakhir.

Administrator awan

Jalankan skrip SSO.

Disarankan agar Anda menjalankan skrip kustom Anda di PowerShell shell dengan perintah berikut.

./Set-AwsCliSsoCredentials.ps1

Atau, Anda dapat menjalankan skrip dari shell lain dengan memasukkan perintah berikut.

pwsh Set-AwsCliSsoCredentials.ps1
Administrator awan

Pemecahan Masalah

IsuSolusi

No Access kesalahan

Peran IAM yang Anda gunakan tidak memiliki izin untuk mengakses peran atau set izin yang Anda tetapkan dalam parameter. RoleName Perbarui izin untuk peran yang Anda gunakan, atau tentukan peran atau izin yang berbeda yang ditetapkan dalam skrip.

Sumber daya terkait

Informasi tambahan

Skrip SSO

Dalam skrip berikut, ganti placeholder dalam kurung sudut (<>) dengan informasi Anda sendiri dan lepaskan tanda kurung sudut.

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"