Gunakan penyedia kredensi - AWS SDK for PHP

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

Gunakan penyedia kredensi

Penyedia kredensi adalah fungsi yang mengembalikan a GuzzleHttp\Promise\PromiseInterface yang dipenuhi dengan Aws\Credentials\CredentialsInterface instance atau ditolak dengan. Aws\Exception\CredentialsException Anda dapat menggunakan penyedia kredensi untuk mengimplementasikan logika kustom Anda sendiri untuk membuat kredensional atau untuk mengoptimalkan pemuatan kredenal.

Penyedia kredensi diteruskan ke opsi konstruktor credentials klien. Penyedia kredensi bersifat asinkron, yang memaksa mereka untuk dievaluasi secara malas setiap kali operasi API dipanggil. Dengan demikian, meneruskan fungsi penyedia kredensi ke konstruktor klien SDK tidak segera memvalidasi kredensialnya. Jika penyedia kredensi tidak mengembalikan objek kredensial, operasi API akan ditolak dengan file. Aws\Exception\CredentialsException

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; // Use the default credential provider $provider = CredentialProvider::defaultProvider(); // Pass the provider to the client $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

Penyedia Bawaan di SDK

SDK menyediakan beberapa penyedia bawaan yang dapat Anda gabungkan dengan penyedia kustom apa pun. Untuk informasi selengkapnya tentang mengonfigurasi penyedia standar dan rantai penyedia kredensi di SDK, lihat Penyedia kredensi terstandarisasi di Panduan Referensi AWS SDK dan Alat.AWS

penting

Penyedia kredensi dipanggil setiap kali operasi API dilakukan. Jika memuat kredensi adalah tugas yang mahal (misalnya, memuat dari disk atau sumber daya jaringan), atau jika kredensil tidak di-cache oleh penyedia Anda, pertimbangkan untuk membungkus penyedia kredensi Anda dalam suatu fungsi. Aws\Credentials\CredentialProvider::memoize Penyedia kredensi default yang digunakan oleh SDK secara otomatis memoisasi.

Penyedia AssumeRole

Jika Anda menggunakan Aws\Credentials\AssumeRoleCredentialProvider untuk membuat kredensil dengan mengambil peran, Anda perlu memberikan 'client' informasi dengan StsClient objek dan 'assume_role_params' detail, seperti yang ditunjukkan.

catatan

Untuk menghindari pengambilan AWS STS kredensil yang tidak perlu pada setiap operasi API, Anda dapat menggunakan memoize fungsi tersebut untuk menangani penyegaran kredenal secara otomatis saat kredensialnya kedaluwarsa. Lihat kode berikut sebagai contoh.

use Aws\Credentials\CredentialProvider; use Aws\Credentials\InstanceProfileProvider; use Aws\Credentials\AssumeRoleCredentialProvider; use Aws\S3\S3Client; use Aws\Sts\StsClient; // Passing Aws\Credentials\AssumeRoleCredentialProvider options directly $profile = new InstanceProfileProvider(); $ARN = "arn:aws:iam::123456789012:role/xaccounts3access"; $sessionName = "s3-access-example"; $assumeRoleCredentials = new AssumeRoleCredentialProvider([ 'client' => new StsClient([ 'region' => 'us-east-2', 'version' => '2011-06-15', 'credentials' => $profile ]), 'assume_role_params' => [ 'RoleArn' => $ARN, 'RoleSessionName' => $sessionName, ], ]); // To avoid unnecessarily fetching STS credentials on every API operation, // the memoize function handles automatically refreshing the credentials when they expire $provider = CredentialProvider::memoize($assumeRoleCredentials); $client = new S3Client([ 'region' => 'us-east-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

Untuk informasi lebih lanjut mengenai'assume_role_params', lihat AssumeRole.

Penyedia SSO

Aws\Credentials\CredentialProvider::ssoadalah penyedia kredensi masuk tunggal. Penyedia ini juga dikenal sebagai penyedia AWS IAM Identity Center kredensi.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $credentials = new Aws\CredentialProvider::sso('profile default'); $s3 = new Aws\S3\S3Client([ 'version' => 'latest', 'region' => 'us-west-2', 'credentials' => $credentials ]);

Jika Anda menggunakan profil bernama, ganti nama profil Anda dengan 'default' pada contoh sebelumnya. Untuk mempelajari selengkapnya tentang menyiapkan profil bernama, lihat Berbagi config dan credentials file di Panduan Referensi AWS SDK dan Alat. Atau, Anda dapat menggunakan variabel AWS_PROFILElingkungan untuk menentukan pengaturan profil mana yang akan digunakan.

Untuk memahami lebih lanjut cara kerja penyedia Pusat Identitas IAM, lihat Memahami autentikasi Pusat Identitas IAM di Panduan Referensi AWS SDK dan Alat.

Penyedia rantai

Anda dapat menghubungkan penyedia kredensi dengan menggunakan Aws\Credentials\CredentialProvider::chain() fungsi tersebut. Fungsi ini menerima sejumlah argumen variadik, yang masing-masing merupakan fungsi penyedia kredensi. Fungsi ini kemudian mengembalikan fungsi baru yang merupakan komposisi fungsi yang disediakan, sehingga mereka dipanggil satu demi satu sampai salah satu penyedia mengembalikan janji yang berhasil dipenuhi.

defaultProviderMenggunakan komposisi ini untuk memeriksa beberapa penyedia sebelum gagal. Sumber defaultProvider menunjukkan penggunaan chain fungsi.

// This function returns a provider public static function defaultProvider(array $config = []) { // This function is the provider, which is actually the composition // of multiple providers. Notice that we are also memoizing the result by // default. return self::memoize( self::chain( self::env(), self::ini(), self::instanceProfile($config) ) ); }

Membuat penyedia kustom

Penyedia kredensi hanyalah fungsi yang ketika dipanggil mengembalikan promise (GuzzleHttp\Promise\PromiseInterface) yang dipenuhi dengan Aws\Credentials\CredentialsInterface objek atau ditolak dengan. Aws\Exception\CredentialsException

Praktik terbaik untuk membuat penyedia adalah membuat fungsi yang dipanggil untuk membuat penyedia kredensi yang sebenarnya. Sebagai contoh, inilah sumber env penyedia (sedikit dimodifikasi untuk tujuan contoh). Perhatikan bahwa itu adalah fungsi yang mengembalikan fungsi penyedia yang sebenarnya. Ini memungkinkan Anda untuk dengan mudah membuat penyedia kredensi dan menyebarkannya sebagai nilai.

use GuzzleHttp\Promise; use GuzzleHttp\Promise\RejectedPromise; // This function CREATES a credential provider public static function env() { // This function IS the credential provider return function () { // Use credentials from environment variables, if available $key = getenv(self::ENV_KEY); $secret = getenv(self::ENV_SECRET); if ($key && $secret) { return Promise\promise_for( new Credentials($key, $secret, getenv(self::ENV_SESSION)) ); } $msg = 'Could not find environment variable ' . 'credentials in ' . self::ENV_KEY . '/' . self::ENV_SECRET; return new RejectedPromise(new CredentialsException($msg)); }; }

Penyedia DefaultProvider

Aws\Credentials\CredentialProvider::defaultProvideradalah penyedia kredensi default. Penyedia ini digunakan jika Anda menghilangkan credentials opsi saat membuat klien. Ini pertama kali mencoba memuat kredensil dari variabel lingkungan, kemudian dari file.ini (file pertama, diikuti oleh .aws/credentials .aws/config file), dan kemudian dari profil instance (EcsCredentialspertama, diikuti oleh Ec2 metadata).

catatan

Hasil dari penyedia default secara otomatis memoisasi.

Penyedia EcScredentials

Aws\Credentials\CredentialProvider::ecsCredentialsmencoba memuat kredensil dengan GET permintaan, yang URI ditentukan oleh variabel lingkungan AWS_CONTAINER_CREDENTIALS_RELATIVE_URI dalam wadah.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::ecsCredentials(); // Be sure to memoize the credentials $memoizedProvider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $memoizedProvider ]);

penyedia env

Aws\Credentials\CredentialProvider::envmencoba memuat kredensi dari variabel lingkungan.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => CredentialProvider::env() ]);

assumeRoleWithWebIdentityCredentialProvider penyedia

Aws\Credentials\CredentialProvider::assumeRoleWithWebIdentityCredentialProvidermencoba memuat kredensional dengan mengasumsikan peran. Jika variabel lingkungan AWS_ROLE_ARN dan AWS_WEB_IDENTITY_TOKEN_FILE ada, penyedia akan mencoba untuk mengambil peran yang ditentukan saat AWS_ROLE_ARN menggunakan token pada disk pada jalur lengkap yang ditentukan dalamAWS_WEB_IDENTITY_TOKEN_FILE. Jika variabel lingkungan digunakan, penyedia akan mencoba untuk mengatur sesi dari variabel AWS_ROLE_SESSION_NAME lingkungan.

Jika variabel lingkungan tidak disetel, penyedia akan menggunakan profil default, atau yang ditetapkan sebagaiAWS_PROFILE. Penyedia membaca profil dari ~/.aws/credentials dan secara ~/.aws/config default, dan dapat membaca dari profil yang ditentukan dalam opsi filename konfigurasi. Penyedia akan mengambil peran dalam role_arn profil, membaca token dari jalur lengkap yang ditetapkanweb_identity_token_file. role_session_nameakan digunakan jika diatur pada profil.

Penyedia disebut sebagai bagian dari rantai default dan dapat dipanggil secara langsung.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::assumeRoleWithWebIdentityCredentialProvider(); // Cache the results in a memoize function to avoid loading and parsing // the ini file on every API operation $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

Secara default, penyedia kredensi ini akan mewarisi wilayah yang dikonfigurasi yang akan digunakan oleh StsClient untuk mengambil peran. Secara opsional, penuh StsClient dapat disediakan. Kredensi harus ditetapkan seperti false pada apa pun yang disediakan. StsClient

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; use Aws\Sts\StsClient; $stsClient = new StsClient([ 'region' => 'us-west-2', 'version' => 'latest', 'credentials' => false ]) $provider = CredentialProvider::assumeRoleWithWebIdentityCredentialProvider([ 'stsClient' => $stsClient ]); // Cache the results in a memoize function to avoid loading and parsing // the ini file on every API operation $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

penyedia ini

Aws\Credentials\CredentialProvider::inimencoba memuat kredensi dari file kredensi ini. Secara default, SDK mencoba memuat profil “default” dari AWS credentials file bersama yang terletak di~/.aws/credentials.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::ini(); // Cache the results in a memoize function to avoid loading and parsing // the ini file on every API operation $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

Anda dapat menggunakan profil kustom atau lokasi file.ini dengan memberikan argumen ke fungsi yang membuat penyedia.

$profile = 'production'; $path = '/full/path/to/credentials.ini'; $provider = CredentialProvider::ini($profile, $path); $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

penyedia proses

Aws\Credentials\CredentialProvider::processmencoba memuat kredensi dari credential_process yang ditentukan dalam file kredensi ini. Secara default, SDK mencoba memuat profil “default” dari AWS credentials file bersama yang terletak di~/.aws/credentials. SDK akan memanggil perintah credential_process persis seperti yang diberikan dan kemudian membaca data JSON dari stdout. Credential_process harus menulis kredensi ke stdout dalam format berikut:

{ "Version": 1, "AccessKeyId": "", "SecretAccessKey": "", "SessionToken": "", "Expiration": "" }

SessionTokendan Expiration bersifat opsional. Jika ada, kredensialnya akan diperlakukan sebagai sementara.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::process(); // Cache the results in a memoize function to avoid loading and parsing // the ini file on every API operation $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

Anda dapat menggunakan profil kustom atau lokasi file.ini dengan memberikan argumen ke fungsi yang membuat penyedia.

$profile = 'production'; $path = '/full/path/to/credentials.ini'; $provider = CredentialProvider::process($profile, $path); $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

Penyedia InstanceProfile

Aws\Credentials\CredentialProvider::instanceProfilemencoba memuat kredensional dari profil instans Amazon EC2.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::instanceProfile(); // Be sure to memoize the credentials $memoizedProvider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $memoizedProvider ]);

Secara default, penyedia mencoba lagi mengambil kredensi hingga tiga kali. Jumlah percobaan ulang dapat diatur dengan retries opsi, dan dinonaktifkan sepenuhnya dengan mengatur opsi ke0.

use Aws\Credentials\CredentialProvider; $provider = CredentialProvider::instanceProfile([ 'retries' => 0 ]); $memoizedProvider = CredentialProvider::memoize($provider);
catatan

Anda dapat menonaktifkan upaya pemuatan ini dari profil instans Amazon EC2 dengan menyetel variabel AWS_EC2_METADATA_DISABLED lingkungan ke. true

Memoisasi kredensi

Terkadang Anda mungkin perlu membuat penyedia kredensi yang mengingat nilai pengembalian sebelumnya. Ini dapat berguna untuk kinerja saat memuat kredensil adalah operasi yang mahal atau saat menggunakan Aws\Sdk kelas untuk berbagi penyedia kredensi di beberapa klien. Anda dapat menambahkan memoisasi ke penyedia kredensi dengan membungkus fungsi penyedia kredensi dalam suatu fungsi. memoize

use Aws\Credentials\CredentialProvider; $provider = CredentialProvider::instanceProfile(); // Wrap the actual provider in a memoize function $provider = CredentialProvider::memoize($provider); // Pass the provider into the Sdk class and share the provider // across multiple clients. Each time a new client is constructed, // it will use the previously returned credentials as long as // they haven't yet expired. $sdk = new Aws\Sdk(['credentials' => $provider]); $s3 = $sdk->getS3(['region' => 'us-west-2', 'version' => 'latest']); $ec2 = $sdk->getEc2(['region' => 'us-west-2', 'version' => 'latest']); assert($s3->getCredentials() === $ec2->getCredentials());

Saat kredensil yang dimemoisasi kedaluwarsa, pembungkus memoize memanggil penyedia yang dibungkus dalam upaya untuk menyegarkan kredensil.