

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

# Peran IAM
<a name="id_roles"></a>

Sebuah *peran IAM* adalah identitas IAM yang dapat Anda buat di akun yang memiliki izin tertentu. Peran IAM mirip dengan pengguna IAM, karena itu adalah AWS identitas dengan kebijakan izin yang menentukan apa yang dapat dan tidak dapat dilakukan identitas. AWS Namun, alih-alih secara unik terkait dengan satu orang, peran dimaksudkan untuk menjadi dapat diambil oleh siapa pun yang membutuhkannya. Selain itu, peran tidak memiliki kredensial jangka panjang standar seperti kata sandi atau kunci akses yang terkait dengannya. Sebagai gantinya, saat Anda mengambil peran, peran tersebut akan memberikan kredensial keamanan sementara untuk sesi peran.

Anda dapat menggunakan peran untuk mendelegasikan akses ke pengguna, aplikasi, atau layanan yang biasanya tidak memiliki akses ke AWS sumber daya Anda. Misalnya, Anda mungkin ingin memberi pengguna di AWS akun Anda akses ke sumber daya yang biasanya tidak mereka miliki, atau memberikan pengguna dalam satu Akun AWS akses ke sumber daya di akun lain. Atau Anda mungkin ingin mengizinkan aplikasi seluler menggunakan AWS sumber daya, tetapi tidak ingin menyematkan AWS kunci di dalam aplikasi (di mana kunci tersebut sulit diperbarui dan di mana pengguna berpotensi mengekstraknya). Terkadang Anda ingin memberikan AWS akses ke pengguna yang sudah memiliki identitas yang ditentukan di luar AWS, seperti di direktori perusahaan Anda. Atau, Anda mungkin ingin memberikan akses ke akun Anda kepada pihak ketiga sehingga mereka dapat melakukan audit pada sumber daya Anda.

Untuk skenario ini, Anda dapat mendelegasikan akses ke AWS sumber daya menggunakan peran *IAM*. Bagian ini memperkenalkan peran dan berbagai cara yang dapat Anda gunakan, kapan dan bagaimana memilih di antara pendekatan, dan bagaimana membuat, mengelola, beralih ke (atau mengasumsikan), dan menghapus peran.

**catatan**  
Saat pertama kali membuat Akun AWS, tidak ada peran yang dibuat secara default. Saat Anda menambahkan layanan ke akun Anda, mereka dapat menambahkan peran terkait layanan untuk mendukung kasus penggunaannya.  
 Peran terkait layanan adalah jenis peran layanan yang ditautkan ke. Layanan AWS Layanan tersebut dapat menjalankan peran untuk melakukan tindakan atas nama Anda. Peran terkait layanan muncul di Anda Akun AWS dan dimiliki oleh layanan. Administrator IAM dapat melihat, tetapi tidak dapat mengedit izin untuk peran terkait layanan.   
Sebelum Anda dapat menghapus peran terkait layanan, Anda harus terlebih dahulu menghapus sumber daya terkait mereka. Ini melindungi sumber daya Anda karena Anda tidak dapat secara tidak sengaja menghapus izin untuk mengakses sumber daya.  
Untuk informasi tentang layanan mana yang mendukung peran yang terkait dengan layanan, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md) dan cari layanan yang memiliki **Ya **di kolom **Peran Terkait-Layanan** Pilih **Ya** dengan tautan untuk melihat dokumentasi peran terkait layanan untuk layanan tersebut.

**Topics**
+ [Kapan harus membuat pengguna IAM (alih-alih peran)](#id_which-to-choose)
+ [Istilah dan konsep peran](#id_roles_terms-and-concepts)
+ [Sumber daya tambahan](#id_roles_additional-resources)
+ [Masalah confused deputy](confused-deputy.md)
+ [Skenario umum untuk peran IAM](id_roles_common-scenarios.md)
+ [Pembuatan peran IAM](id_roles_create.md)
+ [Manajemen peran IAM](id_roles_manage.md)
+ [Metode untuk mengambil peran](id_roles_manage-assume.md)

## Kapan harus membuat pengguna IAM (alih-alih peran)
<a name="id_which-to-choose"></a>

Kami menyarankan Anda hanya menggunakan pengguna IAM untuk kasus penggunaan yang tidak didukung oleh federasi identitas. Beberapa kasus penggunaan meliputi:
+ **Beban kerja yang tidak dapat menggunakan peran IAM** — Anda dapat menjalankan beban kerja dari lokasi yang perlu diakses. AWS Dalam beberapa situasi, Anda tidak dapat menggunakan peran IAM untuk memberikan kredensi sementara, seperti untuk plugin. WordPress Dalam situasi ini, gunakan kunci akses jangka panjang pengguna IAM agar beban kerja tersebut dapat diautentikasi. AWS
+ ** AWS Klien pihak ketiga** — Jika Anda menggunakan alat yang tidak mendukung akses dengan IAM Identity Center, seperti AWS klien pihak ketiga atau vendor yang tidak di-host AWS, gunakan kunci akses jangka panjang pengguna IAM.
+ **AWS CodeCommit akses** - Jika Anda menggunakan CodeCommit untuk menyimpan kode Anda, Anda dapat menggunakan pengguna IAM dengan kunci SSH atau kredensi khusus layanan untuk CodeCommit mengautentikasi ke repositori Anda. Kami menyarankan Anda melakukan ini selain menggunakan pengguna di IAM Identity Center untuk otentikasi normal. Pengguna di IAM Identity Center adalah orang-orang di tenaga kerja Anda yang membutuhkan akses ke aplikasi cloud Anda Akun AWS atau ke aplikasi cloud Anda. Untuk memberi pengguna akses ke CodeCommit repositori Anda tanpa mengonfigurasi pengguna IAM, Anda dapat mengonfigurasi utilitas. **git-remote-codecommit** Untuk informasi lebih lanjut tentang IAM dan CodeCommit, lihat[Kredensi IAM untuk: Kredensi CodeCommit Git, kunci SSH, dan kunci akses AWS](id_credentials_ssh-keys.md). *Untuk informasi selengkapnya tentang mengonfigurasi **git-remote-codecommit** utilitas, lihat [Menghubungkan ke AWS CodeCommit repositori dengan kredensi berputar](https://docs.aws.amazon.com/codecommit/latest/userguide/temporary-access.html#temporary-access-configure-credentials) di Panduan Pengguna.AWS CodeCommit *
+ **Akses Amazon Keyspaces (untuk Apache Cassandra)** — Dalam situasi di mana Anda tidak dapat menggunakan pengguna di Pusat Identitas IAM, seperti untuk tujuan pengujian kompatibilitas Cassandra, Anda dapat menggunakan pengguna IAM dengan kredensi khusus layanan untuk mengautentikasi dengan Amazon Keyspaces. Pengguna di IAM Identity Center adalah orang-orang di tenaga kerja Anda yang membutuhkan akses ke aplikasi cloud Anda Akun AWS atau ke aplikasi cloud Anda. Anda juga dapat terhubung ke Amazon Keyspaces menggunakan kredensil sementara. Untuk informasi selengkapnya, lihat [Menggunakan kredensil sementara untuk menyambung ke Amazon Keyspaces menggunakan peran IAM dan plugin SigV4 di Panduan Pengembang](https://docs.aws.amazon.com/keyspaces/latest/devguide/access.credentials.html#temporary.credentials.IAM) *Amazon Keyspaces* (untuk Apache Cassandra).
+ **Akses darurat** — Dalam situasi di mana Anda tidak dapat mengakses penyedia identitas Anda dan Anda harus mengambil tindakan di dalamnya Akun AWS. Menetapkan akses darurat pengguna IAM dapat menjadi bagian dari rencana ketahanan Anda. Kami menyarankan agar kredensil pengguna darurat dikontrol dan diamankan dengan ketat menggunakan otentikasi multi-faktor (MFA).

## Istilah dan konsep peran
<a name="id_roles_terms-and-concepts"></a>

Berikut ini beberapa istilah dasar untuk membantu Anda memulai dengan peran.

****Peran****  
Sebuah identitas IAM adalah yang dapat Anda buat di akun Anda yang memiliki izin spesifik. Peran IAM memiliki beberapa kesamaan dengan pengguna IAM. Peran dan pengguna adalah identitas AWS dengan kebijakan izin yang menentukan apa yang dapat dan tidak dapat dilakukan oleh identitas tersebut di AWS. Namun, alih-alih secara unik terkait dengan satu orang, peran dimaksudkan untuk menjadi dapat diambil oleh siapa pun yang membutuhkannya. Selain itu, peran tidak memiliki kredensial jangka panjang standar seperti kata sandi atau kunci akses yang terkait dengannya. Sebagai gantinya, saat Anda mengambil peran, peran tersebut akan memberikan kredensial keamanan sementara untuk sesi peran.  
Peran dapat diasumsikan sebagai berikut:  
+ Pengguna IAM dalam hal yang sama Akun AWS atau lainnya Akun AWS
+ Peran IAM di akun yang sama
+ Prinsipal layanan, untuk digunakan dengan AWS layanan dan fitur seperti:
  + Layanan yang memungkinkan Anda menjalankan kode pada layanan komputasi, seperti Amazon EC2 atau AWS Lambda
  + Fitur yang melakukan tindakan ke sumber daya Anda atas nama Anda, seperti replikasi objek Amazon S3
  + Layanan yang memberikan kredensil keamanan sementara ke aplikasi Anda yang berjalan di luar AWS, seperti IAM Roles Anywhere atau Amazon ECS Anywhere
+ Pengguna eksternal yang diautentikasi oleh layanan penyedia identitas eksternal (IDP) yang kompatibel dengan SAMP 2.0 atau OpenID Connect

****AWS peran layanan****  
 Peran layanan adalah [peran IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) yang diambil oleh sebuah layanan untuk melakukan tindakan atas nama Anda. Administrator IAM dapat membuat, mengubah, dan menghapus peran layanan dari dalam IAM. Untuk informasi selengkapnya, lihat [Buat sebuah peran untuk mendelegasikan izin ke Layanan AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html) dalam *Panduan pengguna IAM*. 

****AWS peran terkait layanan****  
 Peran terkait layanan adalah jenis peran layanan yang ditautkan ke. Layanan AWS Layanan tersebut dapat menjalankan peran untuk melakukan tindakan atas nama Anda. Peran terkait layanan muncul di Anda Akun AWS dan dimiliki oleh layanan. Administrator IAM dapat melihat, tetapi tidak dapat mengedit izin untuk peran terkait layanan.   
Jika Anda sudah menggunakan layanan ketika mulai mendukung peran yang terkait dengan layanan, Anda mungkin menerima email yang mengumumkan peran baru di akun Anda. Dalam hal ini, layanan secara otomatis membuat peran terkait layanan di akun Anda. Anda tidak perlu melakukan tindakan apa pun untuk mendukung peran ini, dan Anda tidak harus menghapusnya secara manual. Untuk informasi selengkapnya, lihat [Peran baru muncul di AWS akun saya](troubleshoot_roles.md#troubleshoot_roles_new-role-appeared).
Untuk informasi tentang layanan mana yang mendukung peran yang terkait dengan layanan, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md) dan cari layanan yang memiliki **Ya **di kolom **Peran Terkait-Layanan** Pilih **Ya** dengan tautan untuk melihat dokumentasi peran terkait layanan untuk layanan tersebut. Untuk informasi selengkapnya, lihat [Buat peran tertaut layanan](id_roles_create-service-linked-role.md).

****Rantai peran****  
Role chaining adalah ketika Anda menggunakan peran untuk mengambil peran kedua. Anda dapat melakukan role chaining melalui Konsol Manajemen AWS dengan mengganti role, the AWS CLI, atau API. Misalnya, `RoleA` memiliki izin untuk berasumsi`RoleB`. Anda dapat mengaktifkan User1 untuk berasumsi `RoleA` dengan menggunakan kredensi pengguna jangka panjang mereka dalam operasi API. AssumeRole Ini mengembalikan kredensi `RoleA` jangka pendek. Dengan rantai peran, Anda dapat menggunakan `RoleA` kredensi jangka pendek untuk mengaktifkan User1 berasumsi. `RoleB`  
Saat Anda mengambil peran, Anda dapat melewatkan tag sesi dan mengatur tag sebagai transitif. Tag sesi transitif diteruskan ke semua sesi berikutnya dalam rantai peran. Untuk mempelajari lebih lanjut tentang tag sesi, lihat [Lulus tag sesi di AWS STS](id_session-tags.md).  
Rantai peran membatasi sesi peran Anda Konsol Manajemen AWS, AWS CLI atau AWS API hingga maksimal satu jam. Ini berlaku terlepas dari durasi sesi maksimum yang dikonfigurasi untuk peran individu. Saat Anda menggunakan operasi API [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) untuk mengambil peran, Anda dapat menentukan durasi sesi peran Anda dengan parameter `DurationSeconds`. Anda dapat menentukan nilai parameter hingga 43200 detik (12 jam), tergantung pada [pengaturan durasi sesi maksimum](id_roles_update-role-settings.md#id_roles_update-session-duration) untuk peran Anda. Akan tetapi, jika Anda berperan menggunakan rantai peran dan memberikan nilai parameter `DurationSeconds` lebih dari satu jam, operasi gagal.  
Untuk informasi tentang beralih ke peran di Konsol Manajemen AWS, lihat[Beralih dari pengguna ke peran IAM (konsol)](id_roles_use_switch-role-console.md).

****Delegasi****  
Pemberian izin kepada seseorang untuk memungkinkan akses ke sumber daya yang Anda kontrol. Delegasi melibatkan terbentuknya kepercayaan antara dua akun. Yang pertama adalah akun yang memiliki sumber daya (akun terpercaya). Kedua adalah akun yang berisi pengguna yang perlu mengakses sumber daya (akun tepercaya). Akun tepercaya dan dipercaya dapat merupakan salah satu dari berikut ini:  
+ Akun yang sama.
+ Pisahkan akun yang berada di bawah kendali organisasi Anda.
+ Dua akun yang dimiliki oleh organisasi yang berbeda.
Untuk mendelegasikan izin untuk mengakses sumber daya, Anda [membuat peran IAM](id_roles_create_for-user.md) di akun terpercaya yang memiliki dua kebijakan terlampir. *Kebijakan izin* memberikan izin yang diperlukan pengguna untuk melaksanakan tugas yang diinginkan pada sumber daya. *Kebijakan kepercayaan* menentukan anggota akun tepercaya mana yang diizinkan untuk menjalankan peran tersebut.  
Saat membuat kebijakan kepercayaan, Anda tidak dapat menentukan wildcard (\$1) sebagai bagian dari dan ARN di elemen utama. Kebijakan terpercaya ini dilampirkan pada peran dalam akun kepercayaan, dan merupakan setengah dari izin. Setengah lainnya adalah kebijakan izin yang melekat pada pengguna dalam akun tepercaya yang [memungkinkan pengguna untuk beralih, atau mengambil peran](id_roles_use_permissions-to-switch.md). Seorang pengguna yang mengambil peran secara sementara memberikan izinnya sendiri dan sebaliknya mengambil izin peran tersebut. Saat pengguna keluar, atau berhenti menggunakan peran tersebut, izin pengguna yang asli akan dipulihkan. Parameter tambahan yang disebut [ID eksternal](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id) membantu memastikan penggunaan peran aman antar akun yang tidak dikontrol oleh organisasi yang sama.

****Kebijakan kepercayaan****  
[Dokumen kebijakan JSON](reference_policies_grammar.md) yang Anda definisikan menjadi prinsip yang Anda *percaya* untuk mengambil peran tersebut. Kebijakan kepercayaan adalah [kebijakan berbasis sumber daya](access_policies.md#policies_resource-based) yang diperlukan yang melekat pada peran dalam IAM. [Prinsipal](reference_policies_elements_principal.md) yang dapat Anda sebutkan dalam kebijakan kepercayaan termasuk pengguna, peran, akun, dan layanan. Untuk informasi selengkapnya, lihat [Cara menggunakan kebijakan kepercayaan dalam peran IAM](https://aws.amazon.com/blogs//security/how-to-use-trust-policies-with-iam-roles/) di *Blog AWS Keamanan*.

****Peran untuk akses lintas akun****  
Peran yang memberikan akses ke sumber daya dalam satu akun ke prinsipal tepercaya dalam akun yang berbeda. Peran adalah cara utama untuk memberikan akses akun silang. Namun, beberapa AWS layanan memungkinkan Anda untuk melampirkan kebijakan secara langsung ke sumber daya (alih-alih menggunakan peran sebagai proxy). Ini disebut kebijakan berbasis sumber daya, dan Anda dapat menggunakannya untuk memberikan prinsipal di akses lain ke sumber daya. Akun AWS Beberapa sumber daya ini termasuk bucket Amazon Simple Storage Service (S3), Amazon Glacier vaults, Amazon Simple Notification Service (SNS) topik, dan Amazon Simple Queue Service (SQS) antrian. Untuk mempelajari layanan yang mendukung kebijakan berbasis sumber daya, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md). Untuk informasi selengkapnya tentang kebijakan berbasis sumber daya, lihat [Akses sumber daya lintas akun di IAM](access_policies-cross-account-resource-access.md).

## Sumber daya tambahan
<a name="id_roles_additional-resources"></a>

Sumber daya berikut dapat membantu Anda mempelajari lebih lanjut tentang terminologi IAM yang terkait dengan peran IAM.
+ **Prinsipal** adalah entitas AWS yang dapat melakukan tindakan dan mengakses sumber daya. Prinsipal dapat berupa Pengguna root akun AWS, pengguna IAM, atau peran. Prinsipal yang mewakili identitas suatu AWS layanan adalah [prinsipal layanan](reference_policies_elements_principal.md#principal-services). Gunakan elemen Utama dalam kebijakan kepercayaan peran untuk menentukan prinsip yang Anda percayai untuk mengambil peran tersebut.

   Untuk informasi lebih lanjut dan contoh prinsip yang dapat Anda izinkan untuk mengambil peran, lihat. [AWS Elemen kebijakan JSON: Principal](reference_policies_elements_principal.md) 
+ **Federasi identitas** menciptakan hubungan kepercayaan antara penyedia identitas eksternal dan AWS. Anda dapat menggunakan penyedia OpenID Connect (OIDC) atau Security Assertion Markup Language (SAM) 2.0 untuk mengelola siapa saja yang dapat mengakses sumber daya. AWS Saat Anda menggunakan OIDC dan SAFL 2.0 untuk mengonfigurasi hubungan kepercayaan antara penyedia identitas eksternal ini dan AWS , pengguna ditetapkan ke peran IAM. Pengguna juga menerima kredensial sementara yang mengizinkan pengguna mengakses sumber daya AWS Anda.

  Untuk informasi lebih lanjut tentang kepala sekolah federasi, lihat. [Penyedia identitas dan federasi ke AWS](id_roles_providers.md)
+ **Prinsipal federasi adalah identitas yang ada dari Directory Service, direktori pengguna perusahaan Anda, atau penyedia OIDC**. AWS memberikan peran kepada kepala sekolah federasi ketika akses diminta melalui penyedia [identitas](id_roles_providers.md).

  Untuk informasi lebih lanjut tentang kepala sekolah federasi SAMP dan OIDC, lihat. [Sesi dan peran pengguna gabungan](introduction_access-management.md#intro-access-roles)
+ **Kebijakan izin adalah kebijakan** berbasis identitas yang menentukan tindakan dan sumber daya apa yang dapat digunakan peran tersebut. Dokumen ini ditulis sesuai dengan aturan Bahasa kebijakan IAM. 

  Untuk informasi selengkapnya, lihat [Referensi kebijakan IAM JSON](reference_policies.md).
+ **Batas izin** adalah fitur lanjutan di mana Anda menggunakan kebijakan untuk membatasi izin maksimum yang dapat diberikan oleh kebijakan berbasis identitas untuk peran. Anda tidak dapat menerapkan batas izin untuk peran yang terkait layanan.

  Lihat informasi yang lebih lengkap di [Batas izin untuk entitas IAM](access_policies_boundaries.md).

# Masalah confused deputy
<a name="confused-deputy"></a>

Masalah "confused deputy" adalah masalah keamanan di mana entitas yang tidak memiliki izin untuk melakukan tindakan dapat memengaruhi entitas yang memiliki hak akses lebih tinggi untuk melakukan tindakan. Untuk mencegah hal ini, AWS sediakan alat yang membantu Anda melindungi akun Anda jika Anda memberi pihak ketiga (dikenal sebagai *lintas akun*) atau AWS layanan lain (dikenal sebagai *lintas layanan*) akses ke sumber daya di akun Anda.

Terkadang, Anda mungkin perlu memberi pihak ketiga akses ke AWS sumber daya Anda (akses delegasi). Misalnya, Anda memutuskan untuk menyewa perusahaan pihak ketiga bernama Example Corp untuk memantau Akun AWS dan membantu mengoptimalkan biaya. Untuk melacak pengeluaran harian Anda, Example Corp perlu mengakses AWS sumber daya Anda. Contoh Corp juga memantau banyak lainnya Akun AWS untuk pelanggan lain. Anda dapat menggunakan peran IAM untuk membangun hubungan tepercaya antara akun Anda Akun AWS dan akun Example Corp. Salah satu aspek penting dari skenario ini adalah *ID eksternal*, pengidentifikasi opsional yang dapat Anda gunakan dalam kebijakan kepercayaan peran IAM untuk menentukan siapa yang dapat mengambil peran tersebut. Fungsi utama dari ID eksternal adalah mengatasi dan mencegah masalah deputi yang membingungkan.

Beberapa AWS layanan (layanan panggilan) menggunakan prinsip AWS layanan mereka untuk mengakses AWS sumber daya dari AWS layanan lain (disebut layanan). Dalam beberapa interaksi layanan ini, Anda dapat mengonfigurasi layanan panggilan untuk berkomunikasi dengan sumber daya dari layanan yang disebut secara berbeda Akun AWS. Contohnya adalah mengonfigurasi AWS CloudTrail untuk menulis ke bucket Amazon S3 pusat yang terletak di bucket berbeda. Akun AWS Layanan panggilan, CloudTrail diberikan akses ke bucket S3 Anda menggunakan kebijakan bucket S3 dengan menambahkan pernyataan allow untuk. `cloudtrail.amazonaws.com`

Ketika kepala AWS layanan dari layanan panggilan mengakses sumber daya dari layanan yang disebut, kebijakan sumber daya dari layanan yang disebut hanya mengotorisasi kepala AWS layanan, dan bukan aktor yang mengkonfigurasi layanan panggilan. Misalnya, bucket S3 yang mempercayai prinsip CloudTrail layanan tanpa kondisi dapat menerima CloudTrail log dari Akun AWS yang dikonfigurasi oleh admin tepercaya, tetapi juga CloudTrail log dari aktor yang tidak sah di dalamnya Akun AWS, jika mereka mengetahui nama bucket S3.

Masalah wakil yang membingungkan muncul ketika seorang aktor menggunakan kepercayaan dari kepala layanan untuk mendapatkan akses ke sumber daya yang tidak dimaksudkan untuk mereka akses. AWS 

## Pencegahan wakil kebingungan lintas akun
<a name="mitigate-confused-deputy"></a>

Diagram berikut menggambarkan masalah wakil kebingungan lintas akun.

![\[Deskripsi masalah confused deputy.\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/confuseddeputyproblem2.png)


Skenario ini mengasumsikan hal berikut:
+ **AWS 1** adalah Anda Akun AWS.
+ **AWS 1: ExampleRole** adalah peran dalam akun Anda. Kebijakan kepercayaan peran ini mempercayai Example Corp dengan menentukan akun AWS Example Corp sebagai akun yang dapat mengambil peran tersebut.

Inilah yang terjadi:

1. Saat Anda mulai menggunakan layanan Example Corp, Anda memberikan ARN **1ExampleRole: ke AWS Example** Corp.

1. Contoh Corp menggunakan peran ARN itu untuk mendapatkan kredensyal keamanan sementara untuk mengakses sumber daya di Anda. Akun AWS Dengan cara ini, Anda mempercayai Example Corp sebagai “deputi” yang dapat bertindak atas nama Anda.

1.  AWS Pelanggan lain juga mulai menggunakan layanan Example Corp, dan pelanggan ini juga menyediakan ARN **1ExampleRole: untuk AWS Example** Corp untuk digunakan. Agaknya pelanggan lain belajar atau menebak **AWS 1: ExampleRole**, yang bukan rahasia.

1. Ketika pelanggan lain meminta Example Corp untuk mengakses AWS sumber daya di (apa yang diklaimnya) akunnya, Example Corp menggunakan **AWS 1: ExampleRole** untuk mengakses sumber daya di akun Anda.

Inilah cara pelanggan lain bisa mendapatkan akses tanpa izin ke sumber daya Anda. Karena pelanggan lain mampu mengelabui Example Corp untuk melakukan tindakan di luar kesadaran pada sumber daya Anda, Example Corp kini adalah “confused deputy.”

Contoh Corp dapat mengatasi masalah wakil yang membingungkan dengan mengharuskan Anda memasukkan pemeriksaan `ExternalId` kondisi dalam kebijakan kepercayaan peran. Contoh Corp menghasilkan `ExternalId` nilai unik untuk setiap pelanggan dan menggunakan nilai itu dalam permintaannya untuk mengambil peran. `ExternalId`Nilai harus unik di antara pelanggan Example Corp dan dikendalikan oleh Example Corp, bukan pelanggannya. Inilah mengapa Anda mendapatkannya dari Example Corp dan Anda tidak membuatnya sendiri. Ini mencegah Example Corp menjadi wakil yang bingung dan memberikan akses ke sumber daya akun lain. AWS 

Dalam skenario kami, bayangkan pengenal unik Example Corp untuk Anda adalah 12345, dan pengenalnya untuk pelanggan lain adalah 67890. Pengidentifikasi ini disederhanakan untuk skenario ini. Umumnya, pengidentifikasi ini adalah GUIDs. Dengan asumsi pengidentifikasi ini bersifat unik di antara pelanggan Example Corp, mereka adalah nilai yang masuk akal untuk digunakan bagi ID eksternal. 

Contoh Corp memberikan nilai ID eksternal 12345 kepada Anda. Anda kemudian harus menambahkan elemen `Condition` ke kebijakan kepercayaan peran yang memerlukan nilai [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-sts](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-sts) 12345, seperti ini:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Principal": {
      "AWS": "Example Corp's AWS Account ID"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringEquals": {
        "sts:ExternalId": "12345"
      }
    }
  }
}
```

------

Elemen Kondisi dalam kebijakan ini memungkinkan Example Corp untuk mengambil peran hanya jika panggilan AssumeRole API menyertakan nilai ID eksternal 12345. Contoh Corp memastikan bahwa setiap kali mengambil peran atas nama pelanggan, selalu menyertakan nilai ID eksternal pelanggan dalam panggilan. AssumeRole Bahkan jika pelanggan lain memasok Example Corp dengan ARN Anda, ia tidak dapat mengontrol ID eksternal yang disertakan Example Corp dalam permintaannya. AWS Hal ini membantu mencegah pelanggan yang tidak berwenang untuk mendapatkan akses ke sumber daya Anda.

Diagram berikut menggambarkannya.

![\[Cara memitigasi masalah confused deputy.\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/confuseddeputymitigation2.png)


1. Seperti sebelumnya, ketika Anda mulai menggunakan layanan Example Corp, Anda memberikan ARN **1ExampleRole: ke AWS Example** Corp.

1.  Saat Example Corp menggunakan ARN peran itu untuk mengambil **AWS peran 1 ExampleRole**:, Example Corp menyertakan ID eksternal Anda (12345) dalam panggilan API. AssumeRole ID eksternal cocok dengan kebijakan kepercayaan peran, sehingga panggilan AssumeRole API berhasil dan Example Corp memperoleh kredensyal keamanan sementara untuk mengakses sumber daya di file Anda. Akun AWS

1.  AWS Pelanggan lain juga mulai menggunakan layanan Example Corp, dan seperti sebelumnya, pelanggan ini juga menyediakan ARN **1ExampleRole: untuk AWS Example** Corp untuk digunakan. 

1. Tapi kali ini, ketika Example Corp mencoba untuk mengambil peran **AWS 1: ExampleRole**, ia memberikan ID eksternal yang terkait dengan pelanggan lain (67890). Pelanggan lain tidak bisa mengubah ini. Contoh Corp melakukan ini karena permintaan untuk menggunakan peran berasal dari pelanggan lain, jadi 67890 menunjukkan keadaan di mana Example Corp bertindak. Karena Anda menambahkan kondisi dengan ID eksternal Anda sendiri (12345) ke kebijakan kepercayaan **AWS 1: ExampleRole**, panggilan AssumeRole API gagal. Pelanggan lain tidak bisa mendapatkan akses tanpa izin ke sumber daya dalam akun Anda (ditunjukkan oleh “X” merah di diagram).

ID eksternal membantu mencegah pelanggan lain menipu Example Corp agar tanpa disadari mengakses sumber daya Anda.

## Pencegahan "confused deputy" lintas layanan
<a name="cross-service-confused-deputy-prevention"></a>

Diagram berikut menunjukkan masalah wakil kebingungan lintas layanan menggunakan contoh interaksi Amazon S3 CloudTrail dan Amazon, di mana aktor yang tidak sah CloudTrail menulis log ke ember Amazon S3 yang tidak diizinkan untuk mereka akses.

![\[Aktor yang tidak sah diberikan akses ke bucket Amazon S3 di akun lain menggunakan prinsip layanan CloudTrail .\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/cross-service-confused-deputy1.png)


Untuk membantu melindungi dari aktor yang tidak berwenang dari menggunakan kepercayaan AWS kepala sekolah untuk mendapatkan akses ke sumber daya Anda, kepala AWS layanan menyertakan informasi tentang AWS sumber daya Akun AWS, dan AWS organisasi tempat mereka bertindak atas nama.

Informasi ini tersedia dalam nilai kunci kondisi global yang dapat digunakan dalam kebijakan sumber daya, atau kebijakan kontrol sumber daya untuk permintaan yang dibuat oleh prinsipal AWS layanan. Sebaiknya gunakan[aws:SourceArn](reference_policies_condition-keys.md#condition-keys-sourcearn), [aws:SourceAccount](reference_policies_condition-keys.md#condition-keys-sourceaccount)[aws:SourceOrgID](reference_policies_condition-keys.md#condition-keys-sourceorgid), atau [aws:SourceOrgPaths](reference_policies_condition-keys.md#condition-keys-sourceorgpaths) dalam kebijakan sumber daya Anda di mana pun kepala AWS layanan diberikan izin untuk mengakses salah satu sumber daya Anda. Kunci kondisi ini memungkinkan Anda untuk menguji kebijakan sumber daya Anda, atau kebijakan kontrol sumber daya yang dilakukan oleh prinsipal AWS layanan yang mengakses sumber daya Anda atas nama sumber AWS daya Akun AWS, atau yang Anda harapkan. AWS Organizations 
+ Gunakan `aws:SourceArn` untuk memungkinkan kepala AWS layanan mengakses sumber daya Anda atas nama sumber daya tertentu, seperti AWS CloudTrail jalur atau AppStream armada tertentu.
+ Gunakan `aws:SourceAccount` untuk memungkinkan kepala AWS layanan mengakses sumber daya Anda atas nama tertentu Akun AWS.
+ Gunakan `aws:SourceOrgID` untuk memungkinkan kepala AWS layanan mengakses sumber daya Anda atas nama tertentu AWS Organizations.
+ Gunakan `aws:SourceOrgPaths` untuk memungkinkan kepala AWS layanan mengakses sumber daya Anda atas nama AWS Organizations jalur tertentu.

Diagram berikut menunjukkan skenario wakil kebingungan lintas layanan ketika sumber daya dikonfigurasi dengan kunci konteks kondisi `aws:SourceAccount` global, dan aktor yang tidak sah dari akun lain mencoba mengakses AWS sumber daya yang tidak dimaksudkan untuk mereka akses.

![\[Aktor yang tidak sah ditolak akses ke bucket Amazon S3 di akun lain menggunakan prinsip layanan CloudTrail .\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/cross-service-confused-deputy2.png)


Menggunakan`aws:SourceArn`, `aws:SourceAccount``aws:SourceOrgID`, dan kunci kondisi `aws:SourceOrgPaths` global dalam kebijakan membantu Anda memastikan prinsip layanan mengakses sumber daya Anda atas nama Anda. Sebaiknya gunakan kunci kondisi ini setiap kali akses ke salah satu sumber daya Anda diberikan kepada prinsipal AWS layanan. 

**catatan**  
Beberapa Layanan AWS interaksi memiliki kontrol tambahan untuk membantu melindungi dari masalah wakil lintas layanan yang membingungkan yang menguji akses pengguna ke sumber daya. Misalnya, ketika hibah kunci KMS dikeluarkan untuk Layanan AWS, AWS KMS menggunakan konteks enkripsi yang terkait dengan sumber daya, dan hibah kunci untuk membantu melindungi dari masalah wakil lintas layanan yang membingungkan.  
Silakan lihat dokumentasi layanan yang Anda gunakan untuk informasi lebih lanjut tentang mekanisme khusus layanan yang dapat membantu menghindari risiko wakil lintas layanan yang membingungkan, dan apakah,`aws:SourceArn`, `aws:SourceAccount``aws:SourceOrgID`, dan `aws:SourceOrgPaths` didukung.

## Perlindungan wakil lintas layanan membingungkan dengan kebijakan berbasis sumber daya
<a name="cross-service-confused-deputy-prevention-resource"></a>

Contoh kebijakan berikut memberikan `cloudtrail.amazonaws.com` akses utama layanan ke bucket Amazon S3, arn:aws:s3: ::amzn-s3-demo-bucket1, hanya jika kepala layanan bertindak atas nama 111122223333. Akun AWS 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CloudTrailAclCheck",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                }
            }
        },
        {
            "Sid": "AWSCloudTrailWrite",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/[optionalPrefix]/Logs/myAccountID/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

------

Contoh kebijakan bucket ini memberikan `appstream.amazonaws.com` akses utama layanan ke skrip PowerShell examplefile.psh dalam s3://amzn-s3-demo-bucket2 hanya jika bertindak atas nama AppStream armada Amazon yang ditentukan, dengan menentukan armada arn dengan. `aws:SourceArn`

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "appstream.amazonaws.com"
                ]
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket2/examplefile.psh",
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": "arn:aws:appstream:us-east-1:111122223333:fleet/ExampleFleetName"
                } 
            }
        }
    ]
}
```

------

## Perlindungan wakil lintas layanan membingungkan dengan kebijakan kontrol sumber daya
<a name="cross-service-confused-deputy-prevention-resource-control"></a>

Anda dapat menggunakan kebijakan kontrol sumber daya (RCP) untuk menerapkan kontrol deputi lintas layanan yang membingungkan ke sumber daya yang didukung. Layanan AWS RCPs memungkinkan Anda untuk secara terpusat menerapkan kontrol wakil bingung lintas layanan pada sumber daya Anda. Anda dapat menggunakan kunci kondisi seperti `aws:SourceOrgId` dan `aws:SourceOrgPaths` dengan RCPs dilampirkan ke AWS Organizations, unit organisasi (OU) atau Akun AWS di organisasi Anda tanpa menambahkan pernyataan ke kebijakan berbasis sumber daya tertentu. Untuk informasi selengkapnya tentang RCPs dan layanan yang didukung, lihat [Kebijakan kontrol sumber daya (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) di *Panduan AWS Organizations Pengguna*.

Contoh berikut RCP menolak akses prinsipal AWS layanan ke bucket Amazon S3 di akun anggota Anda saat tidak sama dengan o-. `aws:SourceOrgID` ExampleOrg Izin yang sesuai harus ada dalam kebijakan berbasis sumber daya dari bucket S3 untuk mengizinkan Layanan AWS prinsipal yang sama dengan o-. `SourceOrgID` ExampleOrg

Kebijakan ini menerapkan kontrol hanya pada permintaan oleh service principals (`"Bool": {"aws:PrincipalIsAWSService": "true"}`) yang memiliki `aws:SourceAccount` key present (`"Null": {"aws:SourceAccount": "false"}`), sehingga integrasi layanan yang tidak memerlukan penggunaan kunci kondisi dan panggilan oleh prinsipal Anda tidak terpengaruh. Jika kunci `aws:SourceAccount` kondisi hadir dalam konteks permintaan, kondisi Null akan mengevaluasi ke true, `aws:SourceOrgID` menyebabkan diberlakukan. Kami menggunakan `aws:SourceAccount` bukan `aws:SourceOrgID` di operator kondisi Null sehingga kontrol masih berlaku jika permintaan berasal dari akun yang bukan milik organisasi.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "RCPEnforceConfusedDeputyProtectionForS3",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3:*"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEqualsIfExists": {
          "aws:SourceOrgID": "o-ExampleOrg"
        },
        "Null": {
          "aws:SourceAccount": "false"
        },
        "Bool": {
          "aws:PrincipalIsAWSService": "true"
        }
      }
    }
  ]
}
```

------

# Skenario umum untuk peran IAM
<a name="id_roles_common-scenarios"></a>

Seperti kebanyakan AWS fitur, Anda biasanya memiliki dua cara untuk menggunakan peran: interaktif di konsol IAM, atau secara terprogram dengan, Alat untuk Windows AWS CLI PowerShell, atau API.
+ Pengguna IAM di akun Anda dengan menggunakan konsol IAM dapat *beralih dari* peran ke sementara menggunakan izin peran di konsol. Pengguna menyerahkan izin mereka dan mengambil izin yang ditetapkan untuk peran tersebut. Saat pengguna keluar dari peran, izin asli mereka dipulihkan.
+ Aplikasi atau layanan yang ditawarkan oleh AWS (seperti Amazon EC2) dapat *mengambil* peran dengan meminta kredensil keamanan sementara untuk peran yang dapat digunakan untuk membuat permintaan terprogram. AWS Anda menggunakan peran dengan cara ini sehingga Anda tidak perlu berbagi atau mempertahankan kredensial keamanan jangka panjang (misalnya, dengan membuat pengguna IAM) untuk setiap entitas yang memerlukan akses ke sumber daya.

**catatan**  
Panduan ini menggunakan frasa *beralih ke peran* dan *memegang peran* secara bergantian.

Cara termudah untuk menggunakan peran adalah dengan memberikan izin kepada pengguna IAM Anda untuk beralih ke peran yang Anda buat dalam peran Anda sendiri atau yang lain. Akun AWS Mereka dapat dengan mudah beralih peran menggunakan konsol IAM untuk menggunakan izin yang biasanya tidak Anda inginkan, dan kemudian keluar dari peran tersebut untuk menyerahkan izin tersebut. Ini dapat membantu mencegah akses *yang tidak disengaja* atau modifikasi sumber daya sensitif.

Untuk penggunaan peran yang lebih kompleks, seperti memberikan akses ke aplikasi dan layanan, atau pengguna eksternal gabungan, Anda dapat menghubungi API `AssumeRole`. Panggilan API ini mengembalikan satu set kredensial sementara yang dapat digunakan aplikasi dalam panggilan API selanjutnya. Tindakan yang dicoba dengan kredensial sementara hanya memiliki izin yang diberikan oleh peran terkait. Sebuah aplikasi tidak harus "keluar" dari peran sebagaimana pengguna di konsol; melainkan aplikasi hanya berhenti menggunakan kredensial sementara dan melanjutkan melakukan panggilan dengan kredensial yang asli.

Pengguna gabungan masuk dengan menggunakan kredensil dari penyedia identitas (iDP). AWS kemudian memberikan kredensi sementara ke iDP tepercaya untuk diteruskan ke pengguna untuk disertakan dalam permintaan sumber daya berikutnya. AWS Kredensial tersebut memberikan izin yang diberikan kepada peran yang ditetapkan.

Bagian ini memberikan gambaran tentang skenario berikut:
+ [Menyediakan akses untuk pengguna IAM di salah satu Akun AWS yang Anda miliki untuk mengakses sumber daya di akun lain yang Anda miliki](id_roles_common-scenarios_aws-accounts.md)
+ [Menyediakan akses ke non beban AWS kerja](id_roles_common-scenarios_non-aws.md)
+ [Menyediakan akses ke pengguna IAM yang Akun AWS dimiliki oleh pihak ketiga](id_roles_common-scenarios_third-party.md)
+ [Menyediakan akses untuk layanan yang ditawarkan oleh AWS ke AWS sumber daya](id_roles_common-scenarios_services.md)
+ [Menyediakan akses untuk pengguna yang diautentikasi secara eksternal (federasi identitas)](id_roles_common-scenarios_federated-users.md)

# Akses untuk pengguna IAM di pengguna lain Akun AWS yang Anda miliki
<a name="id_roles_common-scenarios_aws-accounts"></a>

Anda dapat memberikan izin kepada pengguna IAM untuk beralih ke peran dalam peran Anda Akun AWS atau ke peran yang ditentukan di peran lain Akun AWS yang Anda miliki. 

**catatan**  
Jika Anda ingin memberikan akses ke akun yang tidak Anda miliki atau kontrol, lihat [Akses ke Akun AWS yang dimiliki oleh pihak ketiga](id_roles_common-scenarios_third-party.md) nanti dalam topik ini. 

Bayangkan Anda memiliki instans Amazon EC2 yang sangat penting terhadap organisasi Anda. Alih-alih secara langsung memberikan izin kepada pengguna Anda untuk menghentikan instans, Anda dapat membuat peran atas hak istimewa tersebut. Kemudian, izinkan administrator untuk beralih ke peran saat mereka perlu menghentikan suatu instans. Melakukan hal ini akan menambah lapisan perlindungan berikut ke kejadian:
+ Anda harus secara tegas memberikan izin kepada pengguna Anda untuk mengambil peran tersebut.
+ Pengguna Anda harus secara aktif beralih ke peran menggunakan Konsol Manajemen AWS atau mengambil peran menggunakan AWS API AWS CLI atau.
+ Anda dapat menambahkan perlindungan Multi-Factor Authentication (MFA) ke peran sehingga hanya pengguna yang masuk dengan perangkat MFA yang dapat memegang peran tersebut. Untuk mempelajari cara mengonfigurasi peran sehingga pengguna yang mengasumsikan peran tersebut harus diautentikasi terlebih dahulu menggunakan autentikasi Multi-Factor Authentication (MFA), lihat [Akses API aman dengan MFA](id_credentials_mfa_configure-api-require.md).

Kami menyarankan menggunakan pendekatan ini untuk menegakkan *prinsip hak istimewa paling rendah*. Ini berarti membatasi penggunaan izin yang ditingkatkan hanya pada saat diperlukan untuk tugas tertentu. Dengan peran Anda dapat membantu mencegah perubahan yang tidak disengaja terhadap lingkungan yang sensitif, terutama jika Anda menggabungkannya dengan [audit](cloudtrail-integration.md) untuk membantu memastikan bahwa peran tersebut hanya digunakan saat diperlukan.

Saat Anda membuat peran untuk tujuan ini, Anda menetapkan akun berdasarkan ID yang penggunanya memerlukan akses dalam elemen `Principal` kebijakan kepercayaan peran. Kemudian, Anda dapat memberikan izin kepada pengguna tertentu dalam akun lain untuk beralih ke peran tersebut. Untuk mempelajari apakah prinsipal dalam akun di luar zona kepercayaan (organisasi atau akun terpercaya) memiliki akses untuk mengasumsikan peran Anda, lihat [Apa yang dimaksud dengan Penganalisis Akses IAM?](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html).

Pengguna dalam satu akun dapat beralih ke peran dalam akun yang sama atau berbeda. Saat menggunakan peran tersebut, pengguna hanya dapat melakukan tindakan dan mengakses sumber daya yang diizinkan dengan peran tersebut; izin pengguna yang asli ditangguhkan. Saat pengguna keluar dari peran, izin pengguna asli mereka dipulihkan.

## Contoh skenario menggunakan akun pengembangan dan produksi terpisah
<a name="id_roles_common-scenarios_aws-accounts-example"></a>

Bayangkan bahwa organisasi Anda memiliki banyak Akun AWS untuk mengisolasi lingkungan pengembangan dari lingkungan produksi. Pengguna di akun pengembangan mungkin kadang kala perlu mengakses sumber daya di akun produksi. Misalnya, Anda mungkin memerlukan akses akun silang saat mempromosikan pembaruan dari lingkungan pengembangan ke lingkungan produksi. Meskipun Anda dapat membuat identitas terpisah (dan kata sandi) untuk pengguna yang bekerja di kedua akun, mengelola kredensial untuk beberapa akun membuat manajemen identitas menjadi sulit. Dalam gambar berikut, semua pengguna dikelola dalam akun pengembangan, tetapi beberapa pengembang memerlukan akses terbatas ke akun produksi. Akun pengembangan memiliki dua grup: Penguji dan Developer, lalu setiap grup memiliki kebijakannya sendiri.

![\[Gunakan peran untuk izin delegasi kepada pengguna di akun yang berbeda\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/roles-usingroletodelegate.png)


1. Di akun produksi, administrator menggunakan IAM untuk membuat peran `UpdateApp` dalam akun tersebut. Dalam peran tersebut, administrator mendefinisikan kebijakan kepercayaan yang menentukan akun pengembangan sebagai `Principal`, yang berarti bahwa pengguna sah dari akun pengembangan dapat menggunakan peran `UpdateApp`. Administrator juga menetapkan kebijakan izin untuk peran yang menentukan izin baca dan tulis ke bucket Amazon S3 yang diberi nama. `productionapp`

   Kemudian, administrator membagikan informasi yang sesuai dengan siapa pun yang perlu menjalankan peran tersebut. Informasi tersebut adalah nomor akun dan nama peran (untuk pengguna AWS konsol) atau Nama Sumber Daya Amazon (ARN) (untuk AWS CLI atau akses AWS API). Peran ARN akan terlihat seperti `arn:aws:iam::123456789012:role/UpdateApp`, di mana peran diberi nama `UpdateApp` dan peran tersebut dibuat pada nomor akun 123456789012.
**catatan**  
Administrator secara opsional dapat mengonfigurasi peran sehingga pengguna yang menerima peran tersebut harus terlebih dahulu diautentikasi menggunakan Multi-Factor Authentication (MFA) Untuk informasi selengkapnya, lihat [Akses API aman dengan MFA](id_credentials_mfa_configure-api-require.md). 

1. Dalam akun pengembangan, administrator memberi anggota grup Pengembang izin untuk beralih ke peran. Ini dilakukan dengan memberikan izin grup Pengembang untuk memanggil AWS Security Token Service (AWS STS) `AssumeRole` API untuk `UpdateApp` peran tersebut. Pengguna IAM mana pun yang termasuk dalam grup Pengembang di akun pengembangan sekarang dapat beralih ke peran `UpdateApp` dalam akun produksi. Pengguna lain yang tidak berada dalam grup developer tidak memiliki izin untuk beralih ke peran tersebut sehingga tidak dapat mengakses bucket S3 dalam akun produksi.

1. Pengguna meminta untuk beralih ke peran:
   + AWS konsol: Pengguna memilih nama akun di bilah navigasi dan memilih **Beralih** Peran. Pengguna menentukan ID akun (atau alias) dan nama peran. Atau, pengguna dapat mengklik tautan yang dikirim melalui email oleh administrator. Tautan tersebut membawa pengguna ke halaman **Beralih Peran** dengan detail yang sudah diisi.
   + AWS API/AWS CLI: Seorang pengguna dalam grup Pengembang dari akun pengembangan memanggil `AssumeRole` fungsi untuk mendapatkan kredensi untuk peran tersebut. `UpdateApp` Pengguna menentukan ARN dari peran `UpdateApp` sebagai bagian dari panggilan. Jika pengguna di grup Testers melakukan permintaan yang sama, permintaan tersebut gagal karena Penguji tidak memiliki izin untuk menelepon `AssumeRole` untuk peran `UpdateApp` ARN.

1. AWS STS mengembalikan kredensi sementara:
   + AWS console: AWS STS memverifikasi permintaan dengan kebijakan kepercayaan peran untuk memastikan bahwa permintaan tersebut berasal dari entitas tepercaya (yaitu: akun pengembangan). Setelah verifikasi, AWS STS mengembalikan [kredensi keamanan sementara](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html) ke konsol. AWS 
   + API/CLI: AWS STS memverifikasi permintaan terhadap kebijakan kepercayaan peran untuk memastikan bahwa permintaan tersebut berasal dari entitas tepercaya (yaitu: akun Pengembangan). Setelah verifikasi, AWS STS mengembalikan [kredensi keamanan sementara](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html) ke aplikasi.

1. Kredensi sementara memungkinkan akses ke sumber daya: AWS 
   + AWS konsol: AWS Konsol menggunakan kredensi sementara atas nama pengguna untuk semua tindakan konsol berikutnya, dalam hal ini, untuk membaca dan menulis ke bucket. `productionapp` Konsol tidak dapat mengakses sumber daya lain di akun produksi. Saat pengguna keluar dari peran, izin pengguna kembali ke izin awal yang ada sebelum beralih ke peran.
   + API?CLI: Aplikasi menggunakan kredensial keamanan sementara untuk memperbarui bucket `productionapp`. Dengan kredensial keamanan sementara, aplikasi hanya dapat membaca dari dan menulis ke bucket `productionapp` dan tidak dapat mengakses sumber daya lain dalam akun Produksi. Aplikasi tidak perlu keluar dari peran, tetapi berhenti menggunakan kredensial sementara dan menggunakan kredensial asli pada panggilan API selanjutnya.

## Sumber daya tambahan
<a name="id_roles_common-scenarios_more-info"></a>

Untuk informasi selengkapnya, lihat informasi berikut:
+ [Tutorial IAM: Delegasikan akses di seluruh AWS akun menggunakan peran IAM](tutorial_cross-account-with-roles.md)

# Akses untuk non beban AWS kerja
<a name="id_roles_common-scenarios_non-aws"></a>

[Peran IAM](id_roles.md) [adalah objek di AWS Identity and Access Management (IAM) yang diberi izin.](access_policies.md) Ketika Anda [mengasumsikan peran tersebut](id_roles_manage-assume.md) menggunakan identitas IAM atau identitas dari luar AWS, itu memberi Anda kredensi keamanan sementara untuk sesi peran Anda. Anda mungkin memiliki beban kerja yang berjalan di pusat data atau infrastruktur lain di luar AWS yang harus mengakses AWS sumber daya Anda. Alih-alih membuat, mendistribusikan, dan mengelola kunci akses jangka panjang, Anda dapat menggunakan AWS Identity and Access Management Roles Anywhere (IAM Roles Anywhere) untuk mengautentikasi non beban kerja Anda. AWS IAM Roles Anywhere menggunakan sertifikat X.509 dari otoritas sertifikat (CA) Anda untuk mengautentikasi identitas dan menyediakan akses dengan aman Layanan AWS dengan kredensi sementara yang disediakan oleh peran IAM.

**Untuk menggunakan Peran IAM Di Mana Saja**

1. Siapkan CA menggunakan [AWS Private Certificate Authority](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)atau menggunakan CA dari infrastruktur PKI Anda sendiri.

1. Setelah menyiapkan CA, Anda membuat objek di IAM Roles Anywhere yang disebut *jangkar kepercayaan*. Anchor ini membangun kepercayaan antara IAM Roles Anywhere dan CA Anda untuk otentikasi.

1. Anda kemudian dapat mengonfigurasi peran IAM yang ada, atau membuat peran baru yang mempercayai layanan IAM Roles Anywhere.

1. Otentikasi non AWS beban kerja Anda dengan IAM Roles Anywhere menggunakan trust anchor. AWS memberikan kredensil sementara non AWS beban kerja ke peran IAM yang memiliki akses ke sumber daya Anda. AWS 

## Sumber daya tambahan
<a name="id_roles_non-aws_additional_resources"></a>

Sumber daya berikut dapat membantu Anda mempelajari lebih lanjut tentang menyediakan akses ke AWS non-beban kerja.
+ Untuk informasi selengkapnya tentang mengonfigurasi Peran IAM Di Mana Saja, lihat [Apa itu AWS Identity and Access Management Peran Di Mana Saja](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html) di Panduan Pengguna *IAM Roles Anywhere*.
+ *Untuk mempelajari cara menyiapkan infrastruktur kunci publik (PKI) untuk Peran IAM Di Mana Saja, lihat Peran [IAM Di Mana Saja dengan otoritas sertifikat eksternal di Blog](https://aws.amazon.com/blogs/) Keamanan.AWS *

# Akses ke Akun AWS yang dimiliki oleh pihak ketiga
<a name="id_roles_common-scenarios_third-party"></a>

Ketika pihak ketiga memerlukan akses ke AWS sumber daya organisasi Anda, Anda dapat menggunakan peran untuk mendelegasikan akses ke sumber daya organisasi Anda. Misalnya, pihak ketiga mungkin menyediakan layanan untuk mengelola sumber daya AWS Anda. Dengan peran IAM, Anda dapat memberikan pihak ketiga ini akses ke AWS sumber daya Anda tanpa membagikan kredensi AWS keamanan Anda. Sebaliknya, pihak ketiga dapat mengakses AWS sumber daya Anda dengan mengasumsikan peran yang Anda buat di situs Anda Akun AWS. Untuk mempelajari apakah prinsipal dalam akun di luar zona kepercayaan (organisasi atau akun terpercaya) memiliki akses untuk mengasumsikan peran Anda, lihat [Apa yang dimaksud dengan Penganalisis Akses IAM?](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html).

Pihak ketiga harus menyediakan Anda dengan informasi berikut untuk membuat peran yang dapat mereka tanggung:
+ ** Akun AWS ID pihak ketiga**. Anda menentukan Akun AWS ID mereka sebagai prinsipal saat Anda menentukan kebijakan kepercayaan untuk peran tersebut.
+ **ID eksternal untuk mengasosiasikan secara unik dengan peran.** ID eksternal dapat berupa pengenal apa pun yang hanya diketahui oleh Anda dan pihak ketiga. Misalnya, Anda dapat menggunakan ID faktur antara Anda dan pihak ketiga, tetapi tidak menggunakan sesuatu yang dapat ditebak, seperti nama atau nomor telepon pihak ketiga. Anda harus menentukan ID ini saat Anda menentukan kebijakan kepercayaan untuk peran tersebut. Pihak ketiga harus memberikan ID ini saat memegang peran tersebut.
+ **Izin yang diperlukan pihak ketiga untuk bekerja dengan AWS sumber daya Anda**. Anda harus menentukan izin ini saat menentukan kebijakan izin peran. Kebijakan ini menetapkan tindakan apa yang dapat mereka lakukan dan sumber daya apa yang dapat mereka akses.

Setelah Anda membuat peran tersebut, Anda harus memberikan peran Amazon Resource Name (ARN) tersebut kepada pihak ketiga. Mereka memerlukan ARN peran Anda untuk menjalankan peran tersebut.

**penting**  
Saat Anda memberi pihak ketiga akses ke AWS sumber daya Anda, mereka dapat mengakses sumber daya apa pun yang Anda tentukan dalam kebijakan. Penggunaan sumber daya Anda oleh mereka dibebankan kepada Anda. Pastikan bahwa Anda membatasi penggunaan sumber daya Anda dengan tepat.

## Eksternal IDs untuk akses pihak ketiga
<a name="id_roles_third-party_external-id"></a>

ID eksternal memungkinkan pengguna yang mengambil peran untuk menegaskan keadaan di mana mereka beroperasi. Itu ini juga memberikan cara bagi pemilik akun untuk mengizinkan peran tersebut untuk diasumsikan hanya dalam keadaan tertentu. Fungsi utama dari ID eksternal adalah untuk mengatasi dan mencegah[Masalah confused deputy](confused-deputy.md).

**penting**  
AWS tidak memperlakukan ID eksternal sebagai rahasia. Setelah Anda membuat rahasia seperti access key pair atau password di AWS, Anda tidak dapat melihatnya lagi. ID eksternal untuk peran dapat dilihat oleh siapa pun yang memiliki izin untuk melihat peran tersebut. 

## Kapan saya harus menggunakan ID eksternal?
<a name="external-id-use"></a>

Gunakan ID eksternal dalam situasi-situasi berikut:
+ Anda adalah Akun AWS pemilik dan Anda telah mengonfigurasi peran untuk pihak ketiga yang mengakses orang lain Akun AWS selain milik Anda. Anda harus meminta ID eksternal dari pihak ketiga yang disertakannya, ketika mereka mengasumsikan peran Anda. Kemudian Anda memeriksa ID eksternal tersebut dalam kebijakan kepercayaan peran Anda. Melakukannya memastikan bahwa pihak eksternal dapat mengasumsikan peran Anda hanya ketika bertindak atas nama Anda.
+ Anda berada dalam posisi mengasumsikan peran atas nama pelanggan yang berbeda seperti Example Corp dalam skenario kami sebelumnya. Anda harus menetapkan ID eksternal unik untuk setiap pelanggan dan menginstruksikan mereka untuk menambahkan ID eksternal ke kebijakan kepercayaan peran mereka. Kemudian Anda harus memastikan bahwa Anda selalu menyertakan ID eksternal yang benar dalam permintaan Anda untuk mengasumsikan peran.

  Anda mungkin sudah memiliki pengidentifikasi unik untuk setiap pelanggan Anda, dan ID unik ini cukup untuk digunakan sebagai ID eksternal. ID eksternal bukan merupakan nilai khusus yang Anda perlukan untuk membuat secara eksplisit, atau melacak secara terpisah, hanya untuk tujuan ini.

  Anda harus selalu menentukan ID eksternal dalam `AssumeRole` panggilan API Anda. Selain saat pelanggan memberi Anda ARN peran, uji apakah Anda dapat mengasumsikan peran tersebut baik dengan atau tanpa ID eksternal yang benar. Jika Anda dapat mengasumsikan peran tersebut tanpa ID eksternal yang benar, jangan menyimpan ARN peran pelanggan dalam sistem Anda. Tunggu hingga pelanggan Anda memperbarui kebijakan kepercayaan peran untuk meminta ID eksternal yang benar. Dengan cara ini, Anda membantu pelanggan Anda untuk melakukan hal yang benar, yang membantu Anda semua melindungi diri dari masalah confused deputy.

## Contoh skenario menggunakan ID eksternal
<a name="id_roles_third-party_example"></a>

Misalnya, katakanlah Anda memutuskan untuk menyewa perusahaan pihak ketiga bernama Example Corp untuk memantau Anda Akun AWS dan membantu mengoptimalkan biaya. Untuk melacak pengeluaran harian Anda, Example Corp perlu mengakses AWS sumber daya Anda. Example Corp juga memantau banyak akun AWS lain untuk nasabah lain.

Jangan berikan Example Corp akses ke pengguna IAM dan kredensialnya jangka panjangnya di akun Anda. AWS Sebaliknya, gunakan peran IAM dan kredensial keamanan sementaranya. Peran IAM menyediakan mekanisme untuk memungkinkan pihak ketiga mengakses AWS sumber daya Anda tanpa perlu berbagi kredensi jangka panjang (seperti kunci akses pengguna IAM).

Anda dapat menggunakan peran IAM untuk membangun hubungan tepercaya antara akun Anda Akun AWS dan akun Example Corp. Setelah hubungan ini terjalin, anggota akun Example Corp dapat memanggil AWS Security Token Service [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)API untuk mendapatkan kredenal keamanan sementara. Anggota Example Corp kemudian dapat menggunakan kredensialnya untuk mengakses AWS sumber daya di akun Anda. 

**catatan**  
Untuk informasi selengkapnya tentang operasi AWS API lainnya yang dapat Anda hubungi untuk mendapatkan kredenal keamanan sementara, lihat. AssumeRole [Bandingkan AWS STS kredensialnya](id_credentials_sts-comparison.md)

Berikut rincian skenario ini secara lebih detail:

1. Anda merekrut Example Corp, sehingga mereka membuat pengenal pelanggan unik untuk Anda. Mereka memberi Anda ID pelanggan unik ini dan Akun AWS nomor mereka. Anda memerlukan informasi ini untuk membuat peran IAM pada langkah berikutnya. 
**catatan**  
Contoh Corp dapat menggunakan nilai string apa pun yang mereka inginkan untuk ExternalId, asalkan unik untuk setiap pelanggan. Itu dapat berupa nomor akun pelanggan atau bahkan string karakter acak, selama tidak ada dua pelanggan yang memiliki nilai yang sama. Itu tidak dimaksudkan untuk menjadi 'rahasia'. Contoh Corp harus memberikan ExternalId nilai kepada setiap pelanggan. Yang penting adalah bahwa itu harus dihasilkan oleh Example Corp dan ***bukan*** pelanggan mereka untuk memastikan setiap ID eksternal unik.

1. Anda masuk AWS dan membuat peran IAM yang memberi Example Corp akses ke sumber daya Anda. Seperti peran IAM lainnya, peran ini memiliki dua kebijakan, kebijakan izin, dan kebijakan kepercayaan. Kebijakan kepercayaan peran menentukan siapa yang dapat mengasumsikan peran tersebut. Dalam skenario sampel kami, kebijakan menentukan Akun AWS jumlah Example Corp sebagai. `Principal` Hal ini memungkinkan identitas dari akun tersebut untuk mengambil peran. Selain itu, Anda menambahkan elemen `[Condition](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Condition)` pada kebijakan kepercayaan. Ini `Condition` menguji `ExternalId` kunci konteks untuk memastikan bahwa itu sesuai dengan ID pelanggan unik dari Example Corp. Misalnya:

   ```
       "Principal": {"AWS": "Example Corp's Akun AWS ID"},
       "Condition": {"StringEquals": {"sts:ExternalId": "Unique ID Assigned by Example Corp"}}
   ```

1. Kebijakan izin untuk peran menentukan apa saja yang diperbolehkan oleh peran untuk dilakukan seseorang. Misalnya, Anda dapat menentukan bahwa peran tersebut dapat memperbolehkan seseorang untuk mengelola hanya sumber daya Amazon EC2 Amazon dan Amazon RDS Anda tetapi tidak dengan pengguna atau grup IAM Anda. Dalam skenario sampel kami, Anda menggunakan kebijakan izin untuk memberikan akses hanya-baca kepada Example Corp ke semua sumber daya dalam akun Anda.

1. Setelah Anda membuat peran tersebut, Anda menyediakan Amazon Resource Name (ARN) dari peran Anda kepada Example Corp.

1. Ketika Example Corp perlu mengakses AWS sumber daya Anda, seseorang dari perusahaan memanggil AWS `sts:AssumeRole` API. Panggilan tersebut mencakup ARN dari peran yang akan diasumsikan dan ExternalId parameter yang sesuai dengan ID pelanggan mereka.

Jika permintaan berasal dari seseorang yang menggunakan Example Corp Akun AWS, dan jika peran ARN dan ID eksternal sudah benar, permintaan berhasil. Ini kemudian memberikan kredensi keamanan sementara yang dapat digunakan Example Corp untuk mengakses AWS sumber daya yang diizinkan oleh peran Anda.

Dengan kata lain, ketika kebijakan peran mencakup ID eksternal, siapa pun yang ingin mengasumsikan peran tersebut haruslah prinsipal dalam peran tersebut dan harus menyertakan ID eksternal yang benar.

## Poin kunci untuk eksternal IDs
<a name="id_roles_third-party_key-points"></a>
+ Dalam lingkungan multi-tenant di mana Anda mendukung beberapa pelanggan dengan AWS akun yang berbeda, kami sarankan untuk menggunakan satu ID eksternal per. Akun AWS ID ini harus berupa string acak yang dihasilkan oleh pihak ketiga.
+ Untuk mewajibkan pihak ketiga untuk memberikan ID eksternal saat mengasumsikan peran, perbarui kebijakan kepercayaan peran tersebut dengan ID eksternal pilihan Anda.
+ Untuk memberikan ID eksternal saat Anda mengambil peran, gunakan AWS CLI atau AWS API untuk mengambil peran tersebut. Untuk informasi lebih lanjut, lihat operasi API STS [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html), atau operasi CLI STS [assume-role](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html).
+ Nilai `ExternalId` harus memiliki minimal 2 karakter dan maksimal 1.224 karakter. Nilai harus berupa alfanumerik tanpa spasi. Alfanumerik dapat mencakup simbol berikut: plus (\$1), sama (=), koma (,), titik (.), di (@), titik dua (:), garis miring (/), dan tanda hubung (-).

## Sumber daya tambahan
<a name="id_roles_third-party_additional_resources"></a>

Sumber daya berikut dapat membantu Anda mempelajari lebih lanjut tentang menyediakan akses yang Akun AWS dimiliki oleh pihak ketiga.
+ Untuk mempelajari cara mengizinkan orang lain melakukan tindakan dalam diri Anda Akun AWS, lihat[Membuat peran menggunakan kebijakan kepercayaan khusus](id_roles_create_for-custom.md).
+ Untuk mempelajari cara memberikan izin untuk beralih ke peran, lihat [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md)
+ Untuk mempelajari cara membuat dan menyediakan kredensi keamanan sementara kepada pengguna tepercaya, [Izin untuk kredensial keamanan sementara](id_credentials_temp_control-access.md)

# Akses ke AWS layanan
<a name="id_roles_common-scenarios_services"></a>

Banyak AWS layanan mengharuskan Anda menggunakan peran untuk mengontrol apa yang dapat diakses oleh layanan tersebut. Peran yang diasumsikan layanan untuk melakukan tindakan atas nama Anda disebut [peran layanan](id_roles.md#iam-term-service-role). Ketika suatu peran melayani tujuan khusus untuk suatu layanan, itu dapat dikategorikan sebagai peran [terkait layanan](id_roles.md#iam-term-service-linked-role). Lihat [dokumentasi AWS](https://docs.aws.amazon.com/) untuk setiap layanan guna melihat apakah layanan menggunakan peran dan untuk pelajari cara menetapkan peran untuk digunakan layanan.

Untuk detail tentang membuat peran untuk mendelegasikan akses ke layanan yang ditawarkan oleh AWS, lihat[Membuat peran untuk mendelegasikan izin ke layanan AWS](id_roles_create_for-service.md).

# Akses ke pengguna yang diautentikasi secara eksternal (federasi identitas)
<a name="id_roles_common-scenarios_federated-users"></a>

Pengguna Anda mungkin sudah memiliki identitas di luar AWS, seperti di direktori perusahaan Anda. Jika pengguna tersebut perlu bekerja dengan AWS sumber daya (atau bekerja dengan aplikasi yang mengakses sumber daya tersebut), maka pengguna tersebut juga memerlukan AWS kredensil keamanan. Anda dapat menggunakan peran IAM untuk menentukan izin bagi pengguna yang identitasnya difederasi dari organisasi Anda atau penyedia identitas pihak ketiga (IdP).

**catatan**  
Sebagai praktik terbaik keamanan, kami sarankan Anda mengelola akses pengguna di [Pusat Identitas IAM](https://docs.aws.amazon.com//singlesignon/latest/userguide/what-is.html) dengan federasi identitas alih-alih membuat pengguna IAM. Untuk informasi tentang situasi tertentu di mana pengguna IAM diperlukan, lihat [Kapan membuat pengguna IAM (bukan peran](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html#id_which-to-choose)).

## Pengguna federasi dari aplikasi seluler atau berbasis web dengan Amazon Cognito
<a name="id_roles_common-scenarios_federated-users-cognito"></a>

Jika Anda membuat aplikasi seluler atau berbasis web yang mengakses AWS sumber daya, aplikasi memerlukan kredensi keamanan untuk membuat permintaan terprogram. AWS Untuk sebagian besar skenario aplikasi seluler, kami menyarankan agar Anda menggunakan [Amazon Cognito](https://aws.amazon.com/cognito/). Anda dapat menggunakan layanan ini dengan SDK [AWS Seluler untuk iOS dan SDK Seluler untuk](https://aws.amazon.com/sdkforios/) [Android dan AWS Fire OS untuk membuat identitas unik bagi pengguna dan](https://aws.amazon.com/sdkforandroid/) mengautentikasi mereka untuk akses aman ke sumber daya Anda. AWS Amazon Cognito mendukung penyedia identitas yang sama seperti yang tercantum di bagian berikutnya, dan juga mendukung [identitas yang diautentikasi pengembang](https://aws.amazon.com/blogs/mobile/amazon-cognito-announcing-developer-authenticated-identities) dan akses (tamu) yang tidak terotentikasi. Amazon Cognito juga menyediakan operasi API untuk mensinkronisasi data pengguna sehingga data terjaga saat pengguna berpindah antar perangkat. Untuk informasi selengkapnya, lihat [Amazon Cognito untuk aplikasi seluler](id_federation_common_scenarios.md#id_roles_providers_oidc_cognito). 

## Menggabungkan pengguna dengan penyedia layanan identitas publik atau OpenID Connect
<a name="id_roles_common-scenarios_federated-users-openId"></a>

Bila memungkinkan, gunakan Amazon Cognito untuk skenario aplikasi berbasis web dan seluler. Amazon Cognito melakukan sebagian besar behind-the-scenes pekerjaan dengan layanan penyedia identitas publik untuk Anda. Ia bekerja dengan layanan pihak ketiga yang sama dan juga mendukung masuk secara anonim. Namun, untuk skenario yang lebih lanjut, Anda dapat bekerja secara langsung dengan layanan pihak ketiga seperti Login with Amazon, Facebook, Google, atau IdP yang kompatibel dengan OpenID Connect (OIDC). Untuk informasi selengkapnya tentang penggunaan federasi OIDC menggunakan salah satu layanan ini, lihat. [Federasi OIDC](id_roles_providers_oidc.md)

## Pengguna federasi dengan SAML 2.0
<a name="id_roles_common-scenarios_federated-users-saml20"></a>

Jika organisasi Anda sudah menggunakan paket perangkat lunak penyedia identitas yang mendukung SAMP 2.0 (Security Assertion Markup Language 2.0), Anda dapat membuat kepercayaan antara organisasi Anda sebagai penyedia identitas (iDP) dan sebagai penyedia layanan. AWS Anda kemudian dapat menggunakan SAMP untuk menyediakan pengguna Anda dengan federated single-sign on (SSO) ke Konsol Manajemen AWS atau akses federasi untuk memanggil operasi API. AWS Misalnya, jika perusahaan Anda menggunakan Microsoft Active Directory dan Active Directory Federation Services, maka Anda dapat melakukan federasi menggunakan SAML 2.0. Untuk informasi selengkapnya tentang pengguna federasi dengan SAML 2.0, lihat [Federasi SAMP 2.0](id_roles_providers_saml.md).

## Pengguna federasi dengan membuat aplikasi broker identitas khusus
<a name="id_roles_common-scenarios_federated-users-idbroker"></a>

Jika penyimpanan identitas tidak kompatibel dengan SAML 2.0, maka Anda dapat membuat aplikasi broker identitas khusus untuk melakukan fungsi yang serupa. Aplikasi broker mengotentikasi pengguna, meminta kredensi sementara untuk pengguna dari AWS, dan kemudian menyediakannya kepada pengguna untuk mengakses sumber daya. AWS 

Misalnya, Example Corp. memiliki banyak karyawan yang perlu menjalankan aplikasi internal yang mengakses AWS sumber daya perusahaan. Karyawan tersebut sudah memiliki identitas di sistem identitas dan autentikasi perusahaan, dan Example Corp. tidak ingin membuat pengguna IAM terpisah untuk setiap karyawan perusahaan.

Bob adalah pengembang di Example Corp. Untuk mengaktifkan aplikasi internal Example Corp untuk mengakses AWS sumber daya perusahaan, Bob mengembangkan aplikasi broker identitas kustom. Aplikasi memverifikasi bahwa karyawan dimasukkan ke dalam sistem identitas dan autentikasi Example Corp. yang ada, yang mungkin menggunakan LDAP, Active Directory, atau sistem lainnya. Aplikasi broker identitas kemudian mendapatkan kredensial keamanan sementara bagi karyawan. Skenario ini mirip dengan yang sebelumnya (aplikasi seluler yang menggunakan sistem otentikasi khusus), kecuali bahwa aplikasi yang membutuhkan akses ke AWS sumber daya semuanya berjalan dalam jaringan perusahaan, dan perusahaan memiliki sistem otentikasi yang ada.

Untuk mendapatkan kredensial keamanan sementara, aplikasi broker identitas menelepon `AssumeRole` atau `GetFederationToken` untuk memperoleh kredensial keamanan sementara, tergantung pada bagaimana Bob ingin mengelola kebijakan untuk pengguna dan kapan kredensial sementara harus kedaluwarsa. (Untuk informasi selengkapnya tentang perbedaan antara operasi API tersebut, lihat [Kredensial keamanan sementara di IAM](id_credentials_temp.md) dan [Izin untuk kredensial keamanan sementara](id_credentials_temp_control-access.md).) Panggilan mengembalikan kredensil keamanan sementara yang terdiri dari ID kunci AWS akses, kunci akses rahasia, dan token sesi. Aplikasi broker identitas membuat kredensial keamanan sementara ini tersedia bagi aplikasi internal perusahaan. Aplikasi kemudian dapat menggunakan kredensial sementara untuk membuat panggilan ke AWS secara langsung. Aplikasi menyimpan kredensial hingga kedaluwarsa, kemudian meminta set kredensial sementara yang baru. Gambar berikut mengilustrasikan skenario ini.

![\[Contoh alur kerja menggunakan aplikasi broker identitas khusus\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/enterprise-authentication-with-identity-broker-application.diagram.png)


Skenario ini memiliki atribut berikut:
+ Aplikasi pialang identitas memiliki izin untuk mengakses layanan token API (STS) IAM untuk membuat kredensial keamanan sementara.
+ Aplikasi pialang identitas dapat memverifikasi bahwa karyawan diautentikasi dengan sistem autentikasi yang sudah ada.
+ Pengguna bisa mendapatkan URL sementara yang memberi mereka akses ke Konsol AWS Manajemen (yang disebut sebagai sistem masuk tunggal).

Untuk informasi tentang membuat kredensial keamanan sementara, lihat [Bandingkan AWS STS kredensialnya](id_credentials_sts-comparison.md). Untuk informasi selengkapnya tentang prinsipal federasi SAMP yang mendapatkan akses ke Management Console, AWS lihat. [Mengaktifkan prinsip federasi SAMP 2.0 untuk mengakses Konsol Manajemen AWS](id_roles_providers_enable-console-saml.md)

# Pembuatan peran IAM
<a name="id_roles_create"></a>

Untuk membuat peran, Anda dapat menggunakan Konsol Manajemen AWS, Tools for Windows PowerShell, atau IAM API. AWS CLI

Jika Anda menggunakan Konsol Manajemen AWS, wizard memandu Anda melalui langkah-langkah untuk membuat peran. Wizard memiliki langkah yang sedikit berbeda tergantung pada apakah Anda membuat peran untuk AWS layanan, untuk Akun AWS, atau untuk prinsipal federasi SAMP atau OIDC.

**Peran untuk pengguna IAM**  
Buat peran ini untuk mendelegasikan izin dalam peran Anda Akun AWS atau ke peran yang ditentukan di peran lain Akun AWS yang Anda miliki. Pengguna dalam satu akun dapat beralih ke peran dalam akun yang sama atau berbeda. Saat menggunakan peran tersebut, pengguna hanya dapat melakukan tindakan dan mengakses sumber daya yang diizinkan dengan peran tersebut; izin pengguna yang asli ditangguhkan. Saat pengguna keluar dari peran, izin pengguna asli mereka dipulihkan.

Untuk informasi selengkapnya, lihat [Buat peran untuk memberikan izin kepada pengguna IAM](id_roles_create_for-user.md).

Untuk informasi selengkapnya tentang membuat peran untuk akses lintas akun, lihat[Membuat peran menggunakan kebijakan kepercayaan khusus](id_roles_create_for-custom.md).

**Peran untuk AWS layanan**  
Buat peran ini untuk mendelegasikan izin ke layanan yang dapat melakukan tindakan atas nama Anda. [Peran layanan](id_roles.md#iam-term-service-role) yang Anda berikan ke layanan harus memiliki kebijakan IAM dengan izin yang memungkinkan layanan melakukan tindakan yang terkait dengan layanan tersebut. Izin yang berbeda diperlukan untuk setiap AWS layanan.

Untuk informasi selengkapnya tentang membuat peran layanan, lihat[Membuat peran untuk mendelegasikan izin ke layanan AWS](id_roles_create_for-service.md).

Untuk informasi selengkapnya tentang membuat peran terkait layanan, lihat. [Buat peran tertaut layanan](id_roles_create-service-linked-role.md)

**Peran untuk federasi identitas**  
Buat peran ini untuk mendelegasikan izin kepada pengguna yang sudah memiliki identitas di luar. AWS Saat Anda menggunakan penyedia identitas , Anda tidak perlu membuat kode masuk khusus atau mengelola identitas pengguna Anda sendiri. Pengguna eksternal Anda masuk melalui iDP, dan Anda dapat memberikan izin identitas eksternal tersebut untuk menggunakan AWS sumber daya di akun Anda. Penyedia identitas membantu menjaga keamanan AWS akun Anda karena Anda tidak perlu mendistribusikan atau menyematkan kredensi keamanan jangka panjang, seperti kunci akses, di aplikasi Anda.

Lihat informasi yang lebih lengkap di [Membuat peran untuk penyedia identitas pihak ketiga](id_roles_create_for-idp.md).

# Buat peran untuk memberikan izin kepada pengguna IAM
<a name="id_roles_create_for-user"></a>

Anda dapat menggunakan peran IAM untuk menyediakan akses ke AWS sumber daya Anda. Dengan peran IAM, Anda dapat membangun hubungan kepercayaan antara akun *kepercayaan* Anda dan akun AWS *tepercaya* lainnya. Akun trusting memiliki sumber daya yang akan diakses dan akun terpercaya berisi pengguna yang membutuhkan akses ke sumber daya. Namun, akun lain bisa saja memiliki sumber daya di akun Anda. Misalnya, akun kepercayaan mungkin mengizinkan akun tepercaya untuk membuat sumber daya baru, seperti membuat objek baru di bucket Amazon S3. Dalam hal ini, akun yang menciptakan sumber daya memiliki sumber daya dan mengendalikan siapa yang dapat mengakses sumber daya tersebut.

Setelah Anda membuat hubungan kepercayaan, pengguna IAM atau aplikasi dari akun tepercaya dapat menggunakan operasi [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)API AWS Security Token Service (AWS STS). Operasi ini menyediakan kredensi keamanan sementara yang memungkinkan akses ke AWS sumber daya di akun Anda.

Akun-akun tersebut dapat dikendalikan oleh Anda, atau akun dengan pengguna-pengguna dapat dikendalikan oleh pihak ketiga. Jika akun lain dengan pengguna adalah Akun AWS yang tidak Anda kendalikan, maka Anda dapat menggunakan `externalId` atribut tersebut. ID eksternal dapat berupa kata atau nomor apa pun yang disepakati antara Anda dan administrator akun pihak ketiga. Opsi ini secara otomatis menambahkan persyaratan kepada kebijakan kepercayaan yang memperbolehkan pengguna untuk mengasumsikan peran hanya jika permintaan mencakup `sts:ExternalID` yang benar. Untuk informasi selengkapnya, lihat [Akses ke Akun AWS yang dimiliki oleh pihak ketiga](id_roles_common-scenarios_third-party.md).

Untuk informasi tentang cara menggunakan peran untuk mendelegasikan izin, lihat [Istilah dan konsep peran](id_roles.md#id_roles_terms-and-concepts). Untuk informasi tentang menggunakan peran layanan untuk memperbolehkan layanan mengakses sumber daya di akun Anda, lihat [Membuat peran untuk mendelegasikan izin ke layanan AWS](id_roles_create_for-service.md).

## Membuat peran IAM (konsol)
<a name="roles-creatingrole-user-console"></a>

Anda dapat menggunakan Konsol Manajemen AWS untuk membuat peran yang dapat diasumsikan oleh pengguna IAM. Misalnya, asumsikan bahwa organisasi Anda memiliki banyak Akun AWS untuk mengisolasi lingkungan pengembangan dari lingkungan produksi. Untuk informasi tingkat tinggi tentang membuat peran yang memungkinkan pengguna di akun pengembangan mengakses sumber daya di akun produksi, lihat[Contoh skenario menggunakan akun pengembangan dan produksi terpisah](id_roles_common-scenarios_aws-accounts.md#id_roles_common-scenarios_aws-accounts-example).

**Izin minimum**  
Untuk melakukan langkah-langkah berikut, Anda harus memiliki setidaknya izin IAM berikut:  
`access-analyzer:ValidatePolicy`
`iam:AttachRolePolicy`
`iam:CreatePolicy`
`iam:CreateRole`
`iam:GetAccountSummary`
`iam:GetPolicy`
`iam:GetPolicyVersion`
`iam:GetRole`
`iam:ListAccountAliases`
`iam:ListAttachedRolePolicies`
`iam:ListOpenIDConnectProviders`
`iam:ListPolicies`
`iam:ListRolePolicies`
`iam:ListRoles`
`iam:ListRoleTags`
`iam:ListSAMLProviders`

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi konsol, pilih **Peran** dan kemudian pilih **Buat peran**.

1. Pilih tipe **Akun AWS**peran.

1. Untuk membuat peran untuk akun Anda, pilih **Akun ini**. Untuk membuat peran untuk akun lain, pilih **Lainnya Akun AWS** dan masukkan **ID Akun** yang ingin Anda berikan akses ke sumber daya Anda.

   Administrator akun yang ditentukan dapat memberikan izin untuk mengasumsikan peran ini kepada setiap pengguna IAM dalam akun tersebut. Untuk melakukannya, administrator melampirkan kebijakan kepada pengguna atau grup yang memberikan izin untuk tindakan `sts:AssumeRole`. Kebijakan tersebut harus menentukan ARN peran sebagai `Resource`. 

1. **Jika Anda memberikan izin kepada pengguna dari akun yang tidak Anda kendalikan, dan pengguna akan mengambil peran ini secara terprogram, pilih Memerlukan ID eksternal.** ID eksternal dapat berupa kata atau nomor apa pun yang disepakati antara Anda dan administrator akun pihak ketiga. Opsi ini secara otomatis menambahkan persyaratan kepada kebijakan kepercayaan yang memperbolehkan pengguna untuk mengasumsikan peran hanya jika permintaan mencakup `sts:ExternalID` yang benar. Untuk informasi selengkapnya, lihat [Akses ke Akun AWS yang dimiliki oleh pihak ketiga](id_roles_common-scenarios_third-party.md).
**penting**  
Memilih opsi ini membatasi akses ke peran hanya melalui AWS CLI, Alat untuk Windows PowerShell, atau AWS API. Ini karena Anda tidak dapat menggunakan AWS konsol untuk beralih ke peran yang memiliki `externalId` kondisi dalam kebijakan kepercayaannya. Namun, Anda dapat membuat jenis akses ini secara terprogram dengan menulis skrip atau aplikasi menggunakan SDK yang relevan. Untuk informasi lebih lanjut dan contoh skrip, lihat [Cara Mengaktifkan Akses Lintas Akun ke Konsol Manajemen AWS](https://aws.amazon.com/blogs/security/how-to-enable-cross-account-access-to-the-aws-management-console) dalam Blog Keamanan AWS .

1. Jika Anda ingin membatasi peran bagi pengguna yang masuk ke multi-factor authentication (MFA) (MFA), pilih **Memerlukan MFA**. Ini menambahkan persyaratan ke kebijakan kepercayaan peran yang memeriksa masuk MFA. Seorang pengguna yang ingin mengasumsikan peran tersebut harus masuk dengan kata sandi satu kali sementara dari perangkat MFA yang dikonfigurasi. Pengguna tanpa otentikasi MFA tidak dapat mengasumsikan peran tersebut. Untuk informasi lebih lanjut tentang MFA, lihat [AWS Otentikasi multi-faktor di IAM](id_credentials_mfa.md)

1. Pilih **Berikutnya**.

1. IAM menyertakan daftar kebijakan yang AWS dikelola dan dikelola pelanggan di akun Anda. Pilih kebijakan yang akan digunakan untuk kebijakan izin atau pilih **Buat kebijakan** untuk membuka tab peramban baru dan membuat kebijakan baru dari awal. Untuk informasi selengkapnya, lihat [Membuat kebijakan IAM](access_policies_create-console.md#access_policies_create-start). Setelah Anda membuat kebijakan, tutup tab tersebut dan kembali ke tab asli Anda. Pilih kotak centang di samping kebijakan izin yang Anda inginkan bagi siapa saja yang mengambil peran tersebut. Jika Anda lebih suka, Anda boleh tidak memilih kebijakan saat ini, kemudian melampirkan kebijakan kepada peran di lain waktu. Secara default, peran tidak memiliki izin.

1. (Opsional) Tetapkan [batas izin](access_policies_boundaries.md). Ini adalah fitur lanjutan. 

   Buka bagian **Atur batasan izin** dan pilih **Gunakan batas izin untuk mengontrol izin peran maksimum**. Pilih kebijakan yang akan digunakan untuk batas izin.

1. Pilih **Berikutnya**.

1. Untuk **Nama peran**, masukkan nama peran Anda. Nama peran harus unik di dalam diri Anda Akun AWS. Bila nama peran digunakan dalam kebijakan atau sebagai bagian dari ARN, nama peran tersebut peka huruf besar/kecil. Saat nama peran muncul ke pelanggan di konsol, seperti selama proses masuk, nama peran tidak peka huruf besar/kecil. Karena berbagai entitas mungkin mereferensikan peran tersebut, Anda tidak dapat mengedit nama peran setelah peran tersebut dibuat.

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi untuk peran baru ini.

1. Pilih **Edit** di **Langkah 1: Pilih entitas tepercaya** atau **Langkah 2: Tambahkan bagian izin** untuk mengedit kasus penggunaan dan izin untuk peran tersebut. Anda akan dikembalikan ke halaman sebelumnya untuk melakukan pengeditan.

1. (Opsional) Tambahkan metadata ke peran dengan melampirkan tag sebagai pasangan nilai kunci. Untuk informasi selengkapnya tentang menggunakan tag di IAM, lihat [Tag untuk AWS Identity and Access Management sumber daya](id_tags.md).

1. Tinjau peran dan kemudian pilih **Buat peran**.
**penting**  
Ingatlah bahwa ini hanya setengah bagian pertama dari konfigurasi yang diperlukan. Anda juga harus memberikan izin kepada pengguna individu dalam akun terpercaya untuk beralih ke peran dalam konsol, atau mengasumsikan peran tersebut secara terprogram. Untuk informasi selengkapnya tentang langkah ini, lihat [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).

------

## Membuat peran IAM ()AWS CLI
<a name="roles-creatingrole-user-cli"></a>

Membuat peran dari AWS CLI melibatkan beberapa langkah. Saat Anda menggunakan konsol untuk membuat peran, banyak langkah dilakukan untuk Anda, tetapi dengan itu AWS CLI Anda harus secara eksplisit melakukan setiap langkah sendiri. Anda harus membuat peran dan kemudian menetapkan kebijakan izin untuk peran tersebut. Atau, Anda juga dapat mengatur [batas izin](access_policies_boundaries.md) untuk peran Anda.

**Untuk membuat peran bagi akses lintas akun (AWS CLI)**

1. Buat peran: [aws iam create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html)

1. Lampirkan kebijakan izin terkelola ke peran: [aws](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html) iam attach-role-policy

    atau

   [Buat kebijakan izin sebaris untuk peran tersebut: aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html)

1. (Opsional) Tambahkan atribut khusus ke peran tersebut dengan melampirkan tag: [aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)

   Untuk informasi selengkapnya, lihat [Mengelola tag pada peran IAM (AWS CLI atau AWS API)](id_tags_roles.md#id_tags_roles_procs-cli-api).

1. [(Opsional) Tetapkan [batas izin](access_policies_boundaries.md) untuk peran: aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html)

   Batas izin mengontrol izin maksimum yang dapat dimiliki sebuah peran. Batas izin adalah AWS fitur lanjutan.

Contoh berikut menunjukkan dua langkah pertama, dan yang paling umum untuk membuat peran lintas akun dalam lingkungan sederhana. Contoh ini memungkinkan setiap pengguna dalam akun `123456789012` untuk mengasumsikan peran dan melihat `example_bucket` bucket Amazon S3. Contoh ini juga mengasumsikan bahwa Anda menggunakan komputer klien yang menjalankan Windows, dan telah mengonfigurasi antarmuka baris perintah Anda kredensial akun dan Wilayah Anda. Untuk informasi selengkapnya, lihat [Mengonfigurasi Antarmuka Baris AWS Perintah](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html).

Dalam contoh ini, sertakan kebijakan kepercayaan berikut pada perintah pertama ketika Anda membuat peran tersebut. Kebijakan kepercayaan ini memperbolehkan pengguna dalam akun `123456789012` untuk mengasumsikan peran dengan menggunakan operasi `AssumeRole`, tetapi hanya jika pengguna memberikan otentikasi MFA dengan menggunakan parameter `SerialNumber` dan `TokenCode`. Untuk informasi lebih lanjut tentang MFA, lihat [AWS Otentikasi multi-faktor di IAM](id_credentials_mfa.md).

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
          "Effect": "Allow",
          "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
          "Action": "sts:AssumeRole",
          "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } }
      }
  ]
}
```

------

**penting**  
Jika elemen `Principal` Anda memuat ARN untuk peran atau pengguna IAM tertentu, kemudian ARN diubah menjadi ID prinsipal unik saat kebijakan disimpan. Hal ini membantu memitigasi risiko seseorang meningkatkan izin mereka dengan menghapus dan membuat kembali peran atau pengguna. Anda biasanya tidak melihat ID ini di dalam konsol karena terdapat transformasi balik kembali ke ARN ketika kebijakan kepercayaan ditampilkan. Namun, jika Anda menghapus peran atau pengguna, maka ID utama muncul di konsol karena tidak AWS dapat lagi memetakannya kembali ke ARN. Oleh karena itu, jika Anda menghapus dan membuat ulang pengguna atau peran yang dirujuk di dalam elemen `Principal` kebijakan kepercayaan, Anda harus mengubah peran untuk mengganti ARN.

Saat menggunakan perintah kedua, Anda harus melampirkan kebijakan terkelola yang ada pada peran tersebut. Kebijakan izin berikut ini memperbolehkan siapa pun yang mengasumsikan peran untuk hanya melaksanakan tindakan `ListBucket` pada `example_bucket` bucket Amazon S3.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
          "Effect": "Allow",
          "Action": "s3:ListBucket",
          "Resource": "arn:aws:s3:::example_bucket"
      }
  ]
}
```

------

Untuk membuat peran `Test-UserAccess-Role` ini, Anda harus terlebih dahulu menyimpan kebijakan kepercayaan sebelumnya dengan nama `trustpolicyforacct123456789012.json` ke folder `policies` di drive lokal `C:` Anda. Kemudian simpan kebijakan izin sebelumnya sebagai kebijakan terkelola pelanggan di nama `PolicyForRole` Anda Akun AWS . Kemudian Anda dapat menggunakan perintah berikut untuk membuat peran dan melampirkan kebijakan terkelola.

```
# Create the role and attach the trust policy file that allows users in the specified account to assume the role.
$ aws iam create-role --role-name Test-UserAccess-Role --assume-role-policy-document file://C:\policies\trustpolicyforacct123456789012.json

# Attach the permissions policy (in this example a managed policy) to the role to specify what it is allowed to do.
$ aws iam attach-role-policy --role-name Test-UserAccess-Role --policy-arn arn:aws:iam::123456789012:policy/PolicyForRole
```

**penting**  
Ingatlah bahwa ini hanya setengah bagian pertama dari konfigurasi yang diperlukan. Anda juga harus memberikan izin kepada pengguna individu dalam akun terpercaya untuk beralih ke peran. Untuk informasi selengkapnya tentang langkah ini, lihat [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).

Setelah Anda membuat peran dan memberinya izin untuk melakukan AWS tugas atau mengakses AWS sumber daya, setiap pengguna di `123456789012` akun dapat mengambil peran tersebut. Untuk informasi selengkapnya, lihat [Beralih ke peran IAM ()AWS CLI](id_roles_use_switch-role-cli.md).

## Membuat peran IAM (AWS API)
<a name="roles-creatingrole-user-api"></a>

Membuat peran dari AWS API melibatkan beberapa langkah. Saat Anda menggunakan konsol untuk membuat peran, banyak langkah yang dilakukan untuk Anda, tetapi dengan API Anda harus melakukan setiap langkah sendiri secara eksplisit. Anda harus membuat peran dan kemudian menetapkan kebijakan izin untuk peran tersebut. Atau, Anda juga dapat mengatur [batas izin](access_policies_boundaries.md) untuk peran Anda.

**Untuk membuat peran dalam kode (AWS API)**

1. Buat peran: [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)

   Untuk kebijakan kepercayaan peran, Anda dapat menentukan lokasi file.

1. Lampirkan kebijakan izin terkelola pada peran: [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)

   atau

   Buat kebijakan izin inline untuk peran: [PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html)
**penting**  
Ingatlah bahwa ini hanya setengah bagian pertama dari konfigurasi yang diperlukan. Anda juga harus memberikan izin kepada pengguna individu dalam akun terpercaya untuk beralih ke peran. Untuk informasi selengkapnya tentang langkah ini, lihat [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).

1. (Opsional) Tambahkan atribut khusus ke pengguna dengan melampirkan tag: [TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)

   Untuk informasi selengkapnya, lihat [Mengelola tag pada pengguna IAM (AWS CLI atau AWS API)](id_tags_users.md#id_tags_users_procs-cli-api).

1. (Opsional) Tetapkan [batas izin](access_policies_boundaries.md) untuk peran tersebut: [PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html)

   Batas izin mengontrol izin maksimum yang dapat dimiliki sebuah peran. Batas izin adalah AWS fitur lanjutan.

Setelah Anda membuat peran dan memberinya izin untuk melakukan AWS tugas atau mengakses AWS sumber daya, Anda harus memberikan izin kepada pengguna di akun agar mereka dapat mengambil peran tersebut. Untuk informasi lebih lanjut tentang mengambil peran, lihat [Beralih ke peran IAM (AWS API)](id_roles_use_switch-role-api.md).

## Membuat peran IAM ()AWS CloudFormation
<a name="roles_creatingrole-user-cloudformation"></a>

Untuk informasi tentang membuat peran IAM AWS CloudFormation, lihat [referensi sumber daya dan properti](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html) serta [contoh](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#aws-resource-iam-role--examples) di *Panduan AWS CloudFormation Pengguna*.

*Untuk informasi selengkapnya tentang template IAM di AWS CloudFormation, lihat [cuplikan AWS Identity and Access Management templat di Panduan](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-iam.html) Pengguna.AWS CloudFormation *

# Membuat peran untuk mendelegasikan izin ke layanan AWS
<a name="id_roles_create_for-service"></a>

Banyak AWS layanan mengharuskan Anda menggunakan peran untuk memungkinkan layanan mengakses sumber daya di layanan lain atas nama Anda. Peran yang diasumsikan layanan untuk melakukan tindakan atas nama Anda disebut [peran layanan](id_roles.md#iam-term-service-role). Ketika suatu peran melayani tujuan khusus untuk suatu layanan, itu dikategorikan sebagai peran [terkait layanan](id_roles.md#iam-term-service-linked-role). Untuk melihat apa yang didukung layanan dengan menggunakan peran yang terkait dengan layanan, atau apakah layanan mendukung segala bentuk kredensial sementara, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md). Untuk mempelajari bagaimana layanan individu menggunakan peran, pilih nama layanan dalam tabel untuk melihat dokumentasi untuk layanan tersebut.

Saat menyetel `PassRole` izin, Anda harus memastikan bahwa pengguna tidak melewati peran di mana peran tersebut memiliki lebih banyak izin daripada yang Anda inginkan untuk dimiliki pengguna. Misalnya, Alice mungkin tidak diizinkan untuk melakukan tindakan Amazon S3 apa pun. Jika Alice dapat meneruskan peran ke layanan yang memungkinkan tindakan Amazon S3, layanan dapat melakukan tindakan Amazon S3 atas nama Alice saat menjalankan pekerjaan.

Untuk informasi tentang cara peran membantu Anda untuk mendelegasikan izin, lihat [Istilah dan konsep peran](id_roles.md#id_roles_terms-and-concepts).

## Izin peran layanan
<a name="id_roles_create_service-permissions"></a>

Anda harus mengonfigurasikan izin untuk memperbolehkan entitas IAM (pengguna atau peran) untuk membuat atau mengubah peran terkait layanan.

**catatan**  
ARN untuk peran terkait layanan mencakup prinsip layanan, yang ditunjukkan dalam kebijakan berikut sebagai. `SERVICE-NAME.amazonaws.com` Jangan mencoba menebak prinsip layanan, karena peka huruf besar/kecil dan formatnya dapat bervariasi antar AWS layanan. Untuk melihat prinsipal layanan untuk suatu layanan, lihat dokumentasi peran yang terkait dengan layanan.

**Untuk memungkinkan entitas IAM untuk membuat peran layanan tertentu**

Tambahkan kebijakan berikut ke entitas IAM yang perlu membuat peran layanan tersebut. Kebijakan ini memungkinkan Anda untuk membuat peran layanan untuk layanan tertentu dan dengan nama yang spesifik. Anda dapat melampirkan kebijakan terkelola atau inline pada peran tersebut. 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:CreateRole",
                "iam:PutRolePolicy"
            ],
            "Resource": "arn:aws:iam::*:role/SERVICE-ROLE-NAME"
        }
    ]
}
```

------

**Untuk memungkinkan entitas IAM membuat peran layanan apa pun**

AWS merekomendasikan bahwa Anda hanya mengizinkan pengguna administratif untuk membuat peran layanan apa pun. Seseorang yang memiliki izin untuk membuat peran dan melampirkan kebijakan apa pun dapat meningkatkan izinnya sendiri. Sebagai gantinya, buat kebijakan yang memungkinkan mereka hanya membuat peran yang mereka butuhkan atau minta administrator membuat peran layanan atas nama mereka.

Untuk melampirkan kebijakan yang memungkinkan administrator mengakses seluruh kebijakan Anda Akun AWS, gunakan kebijakan [AdministratorAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AdministratorAccess) AWS terkelola.

**Untuk mengizinkan entitas IAM mengedit peran layanan**

Tambahkan kebijakan berikut ke entitas IAM yang perlu mengubah peran layanan.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EditSpecificServiceRole",
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DetachRolePolicy",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:ListAttachedRolePolicies",
                "iam:ListRolePolicies",
                "iam:PutRolePolicy",
                "iam:UpdateRole",
                "iam:UpdateRoleDescription"
            ],
            "Resource": "arn:aws:iam::*:role/SERVICE-ROLE-NAME"
        },
        {
            "Sid": "ViewRolesAndPolicies",
            "Effect": "Allow",
            "Action": [
                "iam:GetPolicy",
                "iam:ListRoles"
            ],
            "Resource": "*"
        }
    ]
}
```

------

**Untuk mengizinkan entitas IAM menghapus peran layanan tertentu**

Tambahkan pernyataan berikut ke kebijakan izin untuk entitas IAM yang perlu menghapus peran layanan tertentu.

```
{
    "Effect": "Allow",
    "Action": "iam:DeleteRole",
    "Resource": "arn:aws:iam::*:role/SERVICE-ROLE-NAME"
}
```

**Untuk mengizinkan entitas IAM menghapus peran layanan apa pun**

AWS merekomendasikan bahwa Anda hanya mengizinkan pengguna administratif untuk menghapus peran layanan apa pun. Sebagai gantinya, buat kebijakan yang memungkinkan mereka menghapus hanya peran yang mereka butuhkan atau minta administrator menghapus peran layanan atas nama mereka.

Untuk melampirkan kebijakan yang memungkinkan administrator mengakses seluruh kebijakan Anda Akun AWS, gunakan kebijakan [AdministratorAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AdministratorAccess) AWS terkelola.

## Membuat peran untuk AWS layanan (konsol)
<a name="roles-creatingrole-service-console"></a>

Anda dapat menggunakan Konsol Manajemen AWS untuk membuat peran untuk layanan. Karena beberapa layanan mendukung lebih dari satu peran layanan, lihat [dokumentasi AWS](https://docs.aws.amazon.com/) agar layanan Anda dapat melihat kasus penggunaan mana yang dapat dipilih. Anda dapat mempelajari cara menetapkan kebijakan kepercayaan dan izin yang diperlukan untuk peran tersebut sehingga layanan dapat mengasumsikan peran tersebut atas nama Anda. Langkah-langkah yang dapat Anda gunakan untuk mengontrol izin untuk peran Anda dapat bervariasi, tergantung pada bagaimana layanan mendefinisikan kasus penggunaan, dan apakah Anda membuat peran terkait layanan atau tidak.

------
#### [ Console ]

**Untuk membuat peran untuk Layanan AWS (konsol IAM)**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi konsol IAM, pilih **Peran**, dan lalu pilih **Buat peran**.

1. Untuk **jenis entitas Tepercaya**, pilih **Layanan AWS**.

1. Untuk **kasus Layanan atau penggunaan**, pilih layanan, lalu pilih kasus penggunaan. Kasus penggunaan ditentukan oleh layanan untuk menyertakan kebijakan kepercayaan yang diperlukan layanan.

1. Pilih **Berikutnya**.

1. Untuk **kebijakan Izin**, opsi bergantung pada kasus penggunaan yang Anda pilih:
   + Jika layanan menentukan izin untuk peran tersebut, Anda tidak dapat memilih kebijakan izin.
   + Pilih dari serangkaian kebijakan izin terbatas.
   + Pilih dari semua kebijakan izin.
   + Pilih kebijakan tanpa izin, buat kebijakan setelah peran dibuat, lalu lampirkan kebijakan ke peran.

1. (Opsional) Tetapkan [batas izin](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html). Ini adalah fitur lanjutan yang tersedia untuk peran layanan, tetapi bukan peran tertaut layanan.

   1. Buka bagian **Setel batas izin**, lalu pilih **Gunakan batas izin untuk mengontrol izin peran maksimum**. 

      IAM menyertakan daftar kebijakan yang AWS dikelola dan dikelola pelanggan di akun Anda.

   1. Pilih kebijakan yang akan digunakan untuk batas izin.

1. Pilih **Berikutnya**.

1. Untuk **nama Peran**, opsi bergantung pada layanan:
   + Jika layanan menentukan nama peran, Anda tidak dapat mengedit nama peran.
   + Jika layanan mendefinisikan awalan untuk nama peran, Anda dapat memasukkan akhiran opsional.
   + Jika layanan tidak menentukan nama peran, Anda dapat memberi nama peran.
**penting**  
Saat Anda memberi nama peran, perhatikan hal berikut:  
Nama peran harus unik di dalam diri Anda Akun AWS, dan tidak dapat dibuat unik berdasarkan kasus.  
Misalnya, jangan membuat peran bernama keduanya **PRODROLE** dan**prodrole**. Ketika nama peran digunakan dalam kebijakan atau sebagai bagian dari ARN, nama peran tersebut peka huruf besar/kecil, namun ketika nama peran muncul kepada pelanggan di konsol, seperti selama proses masuk, nama peran tersebut tidak peka huruf besar/kecil.
Anda tidak dapat mengedit nama peran setelah dibuat karena entitas lain mungkin mereferensikan peran tersebut.

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi untuk peran tersebut.

1. **(Opsional) Untuk mengedit kasus penggunaan dan izin untuk peran, di **Langkah 1: Pilih entitas tepercaya** atau **Langkah 2: Tambahkan izin**, pilih Edit.**

1. (Opsional) Untuk membantu mengidentifikasi, mengatur, atau mencari peran, tambahkan tag sebagai pasangan nilai kunci. Untuk informasi selengkapnya tentang penggunaan tag di IAM, lihat [Tag untuk AWS Identity and Access Management sumber daya](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html) di *Panduan Pengguna IAM*.

1. Tinjau peran lalu pilih **Buat peran**.

------

## Membuat peran untuk layanan (AWS CLI)
<a name="roles-creatingrole-service-cli"></a>

Membuat peran dari AWS CLI melibatkan beberapa langkah. Saat Anda menggunakan konsol untuk membuat peran, banyak langkah dilakukan untuk Anda, tetapi dengan itu AWS CLI Anda harus secara eksplisit melakukan setiap langkah sendiri. Anda harus membuat peran dan kemudian menetapkan kebijakan izin untuk peran tersebut. Jika layanan yang Anda gunakan untuk bekerja adalah Amazon EC2, maka Anda juga harus membuat profil instans dan menambahkan peran kepadanya. Atau, Anda juga dapat mengatur [batas izin](access_policies_boundaries.md) untuk peran Anda.

**Untuk membuat peran untuk AWS layanan dari AWS CLI**

1. `[create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html)`Perintah berikut membuat peran bernama *Test-Role* dan melampirkan kebijakan kepercayaan padanya:

   `aws iam create-role --role-name Test-Role --assume-role-policy-document file://Test-Role-Trust-Policy.json`

1. Lampirkan kebijakan izin terkelola ke peran: [aws attach-role-policy iam](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html).

   Misalnya, `attach-role-policy` perintah berikut melampirkan kebijakan AWS terkelola yang dinamai `ReadOnlyAccess` ke peran IAM bernama: `ReadOnlyRole`

   `aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --role-name ReadOnlyRole`

    atau

   [Buat kebijakan izin sebaris untuk peran tersebut: aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html)

   Untuk menambahkan kebijakan izin sebaris, lihat contoh berikut:

    `aws iam put-role-policy --role-name Test-Role --policy-name ExamplePolicy --policy-document file://AdminPolicy.json`

1. (Opsional) Tambahkan atribut khusus ke peran tersebut dengan melampirkan tag: [aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)

   Untuk informasi selengkapnya, lihat [Mengelola tag pada peran IAM (AWS CLI atau AWS API)](id_tags_roles.md#id_tags_roles_procs-cli-api).

1. [(Opsional) Tetapkan [batas izin](access_policies_boundaries.md) untuk peran: aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html)

   Batas izin mengontrol izin maksimum yang dapat dimiliki sebuah peran. Batas izin adalah AWS fitur lanjutan.

Jika Anda akan menggunakan peran dengan Amazon EC2 atau AWS layanan lain yang menggunakan Amazon EC2, Anda harus menyimpan peran tersebut dalam profil instans. Profil instans adalah wadah untuk peran yang dapat dilampirkan ke instans Amazon EC2 saat diluncurkan. Profil instans hanya dapat berisi satu , dan batas tersebut tidak dapat ditingkatkan. Jika Anda membuat peran menggunakan Konsol Manajemen AWS, profil instance dibuat untuk Anda dengan nama yang sama dengan peran. Untuk informasi selengkapnya tentang profil instans, lihat [Gunakan profil contoh](id_roles_use_switch-role-ec2_instance-profiles.md). Untuk informasi tentang cara meluncurkan instans EC2 dengan peran, lihat [Mengontrol Akses ke Sumber Daya Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances) di Panduan Pengguna *Amazon EC2*.

**Untuk membuat profil instans dan menyimpan peran di dalamnya (AWS CLI)**

1. Buat profil instance: [aws iam create-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/create-instance-profile.html)

1. Tambahkan peran ke profil instance: [aws iam add-role-to-instance](https://docs.aws.amazon.com/cli/latest/reference/iam/add-role-to-instance-profile.html) -profile

 AWS CLI Contoh perintah yang ditetapkan di bawah ini menunjukkan dua langkah pertama untuk membuat peran dan melampirkan izin. Itu juga menunjukkan dua langkah untuk membuat profil instans dan menambahkan peran ke profil. Contoh kebijakan kepercayaan ini memungkinkan layanan Amazon EC2 untuk mengambil peran dan melihat `example_bucket` bucket Amazon S3. Contoh ini juga mengasumsikan bahwa Anda sedang bekerja di komputer klien yang menjalankan Windows dan telah mengonfigurasi antarmuka baris perintah Anda dengan kredensial akun dan Wilayah Anda. Untuk informasi selengkapnya, lihat [Mengonfigurasi Antarmuka Baris AWS Perintah](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html).

Dalam contoh ini, sertakan kebijakan kepercayaan berikut pada perintah pertama ketika Anda membuat peran tersebut. Kebijakan kepercayaan ini memungkinkan layanan Amazon EC2 untuk mengasumsikan peran. 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Principal": {"Service": "ec2.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }
}
```

------

Saat Anda menggunakan perintah kedua, Anda harus melampirkan kebijakan izin pada peran tersebut. Contoh kebijakan izin berikut memungkinkan peran untuk hanya mengasumsikan tindakan `ListBucket` pada `example_bucket` bucket Amazon S3.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::example_bucket"
  }
}
```

------

Untuk membuat peran ini `Test-Role-for-EC2`, Anda harus terlebih dahulu menyimpan kebijakan kepercayaan sebelumnya dengan nama `trustpolicyforec2.json` dan kebijakan izin sebelumnya dengan nama `permissionspolicyforec2.json` ke `policies` direktori di lokasi Anda `C:`. Anda dapat menggunakan perintah berikut untuk membuat peran, melampirkan kebijakan, membuat profil instans, dan menambahkan peran ke profil instans.

```
# Create the role and attach the trust policy that allows EC2 to assume this role.
$ aws iam create-role --role-name Test-Role-for-EC2 --assume-role-policy-document file://C:\policies\trustpolicyforec2.json

# Embed the permissions policy (in this example an inline policy) to the role to specify what it is allowed to do.
$ aws iam put-role-policy --role-name Test-Role-for-EC2 --policy-name Permissions-Policy-For-Ec2 --policy-document file://C:\policies\permissionspolicyforec2.json

# Create the instance profile required by EC2 to contain the role
$ aws iam create-instance-profile --instance-profile-name EC2-ListBucket-S3

# Finally, add the role to the instance profile
$ aws iam add-role-to-instance-profile --instance-profile-name EC2-ListBucket-S3 --role-name Test-Role-for-EC2
```

Saat meluncurkan instans EC2, tentukan nama profil instans di halaman **Konfigurasi Detail Instance** jika Anda menggunakan AWS konsol. Jika Anda menggunakan `aws ec2 run-instances` perintah CLI, tentukan `--iam-instance-profile` parameter.

## Membuat peran untuk layanan (AWS API)
<a name="roles-creatingrole-service-api"></a>

Membuat peran dari AWS API melibatkan beberapa langkah. Saat Anda menggunakan konsol untuk membuat peran, banyak langkah yang dilakukan untuk Anda, tetapi dengan API Anda harus melakukan setiap langkah sendiri secara eksplisit. Anda harus membuat peran dan kemudian menetapkan kebijakan izin untuk peran tersebut. Jika layanan yang Anda gunakan untuk bekerja adalah Amazon EC2, maka Anda juga harus membuat profil instans dan menambahkan peran kepadanya. Atau, Anda juga dapat mengatur [batas izin](access_policies_boundaries.md) untuk peran Anda.

**Untuk membuat peran untuk AWS layanan (AWS API)**

1. Buat peran: [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)

   Untuk kebijakan kepercayaan peran, Anda dapat menentukan lokasi file.

1. Lampirkan kebijakan izin terkelola pada peran: [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)

    atau

   Buat kebijakan izin inline untuk peran: [PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html)

1. (Opsional) Tambahkan atribut khusus ke pengguna dengan melampirkan tag: [TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)

   Untuk informasi selengkapnya, lihat [Mengelola tag pada pengguna IAM (AWS CLI atau AWS API)](id_tags_users.md#id_tags_users_procs-cli-api).

1. (Opsional) Tetapkan [batas izin](access_policies_boundaries.md) untuk peran tersebut: [PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html)

   Batas izin mengontrol izin maksimum yang dapat dimiliki sebuah peran. Batas izin adalah AWS fitur lanjutan.

Jika Anda akan menggunakan peran dengan Amazon EC2 atau AWS layanan lain yang menggunakan Amazon EC2, Anda harus menyimpan peran tersebut dalam profil instans. Profil contoh adalah wadah untuk peran. Profil instans hanya dapat berisi satu peran, dan batas tersebut tidak dapat ditingkatkan. Jika Anda membuat peran di Konsol Manajemen AWS, profil instance dibuat untuk Anda dengan nama yang sama dengan peran. Untuk informasi selengkapnya tentang profil instans, lihat [Gunakan profil contoh](id_roles_use_switch-role-ec2_instance-profiles.md). Untuk informasi tentang cara meluncurkan instans Amazon EC2 dengan peran, lihat [Mengontrol Akses ke Sumber Daya Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances) di Panduan Pengguna Amazon *EC2*. 

**Untuk membuat profil instance dan menyimpan peran di dalamnya (AWS API)**

1. Buat profil instans: [CreateInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html)

1. Tambahkan peran ke profil instans: [AddRoleToInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddRoleToInstanceProfile.html)

# Buat peran tertaut layanan
<a name="id_roles_create-service-linked-role"></a>

Peran tertaut layanan adalah tipe unik peran IAM yang tertaut secara langsung dengan layanan AWS . Peran terkait layanan telah ditentukan sebelumnya oleh layanan dan mencakup semua izin yang diperlukan layanan untuk memanggil AWS layanan lain atas nama Anda. Layanan yang terhubung juga menentukan cara Anda membuat, memodifikasi, dan menghapus peran yang terkait dengan layanan. Layanan dapat secara otomatis membuat atau menghapus peran. Peran ini memungkinkan Anda membuat, memodifikasi, atau menghapus peran sebagai bagian dari wizard atau proses dalam layanan. Atau Anda harus menggunakan IAM untuk membuat atau menghapus peran tersebut. Terlepas dari metodenya, peran terkait layanan menyederhanakan proses penyiapan layanan karena Anda tidak perlu menambahkan izin secara manual untuk layanan untuk menyelesaikan tindakan atas nama Anda.

**catatan**  
Ingatlah bahwa peran layanan berbeda dari peran terkait layanan. Peran layanan adalah [peran IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) yang diambil oleh sebuah layanan untuk melakukan tindakan atas nama Anda. Administrator IAM dapat membuat, mengubah, dan menghapus peran layanan dari dalam IAM. Untuk informasi selengkapnya, lihat [Buat sebuah peran untuk mendelegasikan izin ke Layanan AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html) dalam *Panduan pengguna IAM*. Peran terkait layanan adalah jenis peran layanan yang ditautkan ke. Layanan AWS Layanan tersebut dapat menjalankan peran untuk melakukan tindakan atas nama Anda. Peran terkait layanan muncul di Anda Akun AWS dan dimiliki oleh layanan. Administrator IAM dapat melihat, tetapi tidak dapat mengedit izin untuk peran terkait layanan. 

Layanan tertaut menentukan izin peran tertaut-layanannya, dan kecuali ditentukan lain, hanya layanan itu yang dapat mengambil peran tersebut. Izin yang ditentukan mencakup kebijakan kepercayaan dan kebijakan izin, serta bahwa kebijakan izin tidak dapat dilampirkan ke entitas IAM lainnya.

Sebelum Anda dapat menghapus peran, Anda harus terlebih dahulu menghapus sumber daya terkait mereka. Ini membantu mencegah Anda secara tidak sengaja menghapus izin untuk mengakses sumber daya. 

**Tip**  
Untuk informasi tentang layanan mana yang mendukung peran yang terkait dengan layanan, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md) dan cari layanan yang memiliki **Ya **di kolom **Peran Terkait-Layanan** Pilih **Ya** dengan tautan untuk melihat dokumentasi peran terkait layanan untuk layanan tersebut.

## Izin peran terkait layanan
<a name="service-linked-role-permissions"></a>

Anda harus mengonfigurasi izin untuk entitas IAM (pengguna atau peran) untuk mengizinkan pengguna atau peran membuat atau mengedit peran tertaut-layanan.

**catatan**  
ARN untuk peran terkait layanan mencakup prinsipal layanan, yang ditunjukkan dalam kebijakan di bawah ini sebagai `SERVICE-NAME.amazonaws.com`. Jangan mencoba menebak prinsipal layanan, karena peka huruf besar/kecil dan formatnya dapat bervariasi antar AWS layanan. Untuk melihat prinsipal layanan untuk suatu layanan, lihat dokumentasi peran yang terkait dengan layanan.

**Untuk memungkinkan entitas IAM membuat peran terkait layanan tertentu**

Tambahkan kebijakan berikut ke entitas IAM yang perlu membuat peran tertaut-layanan.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:aws:iam::*:role/aws-service-role/SERVICE-NAME.amazonaws.com/SERVICE-LINKED-ROLE-NAME-PREFIX*",
            "Condition": {"StringLike": {"iam:AWSServiceName": "SERVICE-NAME.amazonaws.com"}}
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/SERVICE-NAME.amazonaws.com/SERVICE-LINKED-ROLE-NAME-PREFIX*"
        }
    ]
}
```

------

**Untuk mengizinkan entitas IAM membuat peran terkait layanan apa pun**

Tambahkan pernyataan berikut ke kebijakan izin untuk entitas IAM yang perlu membuat peran tertaut-layanan, atau peran layanan apa pun yang menyertakan kebijakan yang diperlukan. Pernyataan kebijakan ini tidak mengizinkan entitas IAM untuk melampirkan kebijakan ke peran tersebut.

```
{
    "Effect": "Allow",
    "Action": "iam:CreateServiceLinkedRole",
    "Resource": "arn:aws:iam::*:role/aws-service-role/*"
}
```

**Untuk mengizinkan entitas IAM mengedit deskripsi peran layanan apa pun**

Tambahkan pernyataan berikut ke kebijakan izin untuk entitas IAM yang perlu mengedit deskripsi peran tertaut-layanan, atau peran layanan apa pun.

```
{
    "Effect": "Allow",
    "Action": "iam:UpdateRoleDescription",
    "Resource": "arn:aws:iam::*:role/aws-service-role/*"
}
```

**Untuk mengizinkan entitas IAM menghapus peran terkait layanan tertentu**

Tambahkan pernyataan berikut ke kebijakan izin untuk entitas IAM yang perlu menghapus peran tertaut-layanan.

```
{
    "Effect": "Allow",
    "Action": [
        "iam:DeleteServiceLinkedRole",
        "iam:GetServiceLinkedRoleDeletionStatus"
    ],
    "Resource": "arn:aws:iam::*:role/aws-service-role/SERVICE-NAME.amazonaws.com/SERVICE-LINKED-ROLE-NAME-PREFIX*"
}
```

**Untuk mengizinkan entitas IAM menghapus peran terkait layanan**

Tambahkan pernyataan berikut ke kebijakan izin untuk entitas IAM yang perlu menghapus peran tertaut-layanan, tetapi bukan peran layanan.

```
{
    "Effect": "Allow",
    "Action": [
        "iam:DeleteServiceLinkedRole",
        "iam:GetServiceLinkedRoleDeletionStatus"
    ],
    "Resource": "arn:aws:iam::*:role/aws-service-role/*"
}
```

**Untuk memungkinkan entitas IAM meneruskan peran yang ada ke layanan**

Beberapa AWS layanan memungkinkan Anda untuk meneruskan peran yang ada ke layanan, alih-alih membuat peran terkait layanan baru. Untuk melakukannya, pengguna harus memiliki izin untuk *melewati peran tersebut* dengan layanan tersebut. Tambahkan pernyataan berikut ini ke kebijakan izin untuk entitas IAM yang perlu meneruskan peran. Pernyataan kebijakan ini juga memungkinkan entitas untuk melihat daftar peran yang darinya mereka dapat memilih peran untuk diteruskan. Untuk informasi selengkapnya, lihat [Berikan izin pengguna untuk meneruskan peran ke layanan AWS](id_roles_use_passrole.md).

```
{
  "Sid": "PolicyStatementToAllowUserToListRoles",
  "Effect": "Allow",
  "Action": ["iam:ListRoles"],
  "Resource": "*"
},
{
  "Sid": "PolicyStatementToAllowUserToPassOneSpecificRole",
  "Effect": "Allow",
  "Action": [ "iam:PassRole" ],
  "Resource": "arn:aws:iam::account-id:role/my-role-for-XYZ"
}
```

## Izin tidak langsung dengan peran terkait layanan
<a name="create-service-linked-role-permissions-transfer"></a>

Izin yang diberikan oleh peran terkait layanan dapat ditransfer secara tidak langsung ke pengguna dan peran lain. Ketika peran terkait layanan digunakan oleh AWS layanan, peran terkait layanan tersebut dapat menggunakan izinnya sendiri untuk memanggil layanan lain. AWS Ini berarti bahwa pengguna dan peran dengan izin untuk memanggil layanan yang menggunakan peran terkait layanan mungkin memiliki akses tidak langsung ke layanan yang dapat diakses oleh peran terkait layanan tersebut.

Misalnya, saat Anda membuat instans Amazon RDS DB, [peran terkait layanan untuk RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAM.ServiceLinkedRoles.html) secara otomatis dibuat jika belum ada. Peran terkait layanan ini memungkinkan RDS memanggil Amazon EC2, Amazon SNS, Amazon CloudWatch Logs, dan Amazon Kinesis atas nama Anda. Jika Anda mengizinkan pengguna dan peran di akun Anda untuk memodifikasi atau membuat database RDS, mereka mungkin dapat berinteraksi secara tidak langsung dengan Amazon EC2, Amazon SNS, log Amazon Logs, dan sumber daya CloudWatch Amazon Kinesis dengan memanggil RDS, karena RDS akan menggunakan peran terkait layanan untuk mengakses sumber daya tersebut.

### Metode untuk membuat peran terkait layanan
<a name="create-service-linked-role"></a>

Metode yang Anda gunakan untuk membuat peran terkait layanan tergantung pada layanannya. Dalam beberapa kasus, Anda tidak perlu membuat peran terkait layanan secara manual. Misalnya, ketika Anda menyelesaikan tindakan tertentu (seperti membuat sumber daya) dalam layanan, layanan tersebut mungkin membuat peran yang berkaitan dengan layanan bagi Anda. Atau jika Anda menggunakan layanan sebelum mulai mendukung peran tertaut-layanan, maka layanan tersebut mungkin secara otomatis membuat peran tersebut di akun Anda. Untuk mempelajari informasi selengkapnya, lihat [Peran baru muncul di AWS akun saya](troubleshoot_roles.md#troubleshoot_roles_new-role-appeared).

Dalam kasus lain, layanan mungkin mendukung pembuatan peran yang ditautkan ke layanan secara manual menggunakan konsol layanan, API, atau CLI. Untuk informasi tentang layanan mana yang mendukung peran yang terkait dengan layanan, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md) dan cari layanan yang memiliki **Ya **di kolom **Peran Terkait-Layanan** Untuk mempelajari apakah layanan mendukung pembuatan peran tertaut-layanan, pilih tautan **Ya** untuk melihat dokumentasi peran tertaut-layanan untuk layanan itu.

Jika layanan tidak mendukung pembuatan peran, maka Anda dapat menggunakan IAM untuk membuat peran yang terhubung dengan layanan.

**penting**  
Peran terkait layanan dihitung terhadap peran [IAM Anda dalam Akun AWS batas, tetapi jika Anda telah mencapai batas, Anda masih dapat membuat peran](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entities) terkait layanan di akun Anda. Hanya peran yang berkaitan dengan layanan yang dapat melebihi batas.

### Membuat peran terkait layanan (konsol)
<a name="create-service-linked-role-iam-console"></a>

Sebelum Anda membuat peran yang ditautkan ke layanan di IAM, cari tahu apakah layanan yang ditautkan secara otomatis membuat peran yang ditautkan ke layanan. Selain itu, pelajari apakah Anda dapat membuat peran dari konsol layanan, API, atau CLI.<a name="create-service-linked-role-iam-console"></a>

**Untuk membuat peran terkait layanan (konsol)**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi konsol IAM, pilih **Peran**. Kemudian, pilih **Buat peran**.

1. Pilih jenis peran **AWS Layanan**.

1. Pilih kasus penggunaan untuk layanan Anda. Kasus penggunaan ditentukan oleh layanan untuk menyertakan kebijakan kepercayaan yang disyaratkan oleh layanan. Lalu, pilih **Selanjutnya**.

1. Pilih satu kebijakan izin atau lebih untuk dilampirkan ke peran tersebut. Bergantung pada kasus penggunaan yang Anda pilih, layanan mungkin melakukan salah satu hal berikut:
   + Tentukan izin yang digunakan oleh peran.
   + Memungkinkan Anda memilih dari serangkaian izin terbatas.
   + Memungkinkan Anda memilih dari izin apa pun.
   + Memungkinkan Anda memilih tidak ada kebijakan saat ini, membuat kebijakan nanti, lalu melampirkannya ke peran.

   **Pilih kotak centang di samping kebijakan yang menetapkan izin yang Anda inginkan untuk peran tersebut, lalu pilih Berikutnya.** 
**catatan**  
Izin yang Anda tentukan tersedia untuk setiap entitas yang menggunakan peran tersebut. Secara default, peran tidak memiliki izin.

1. Untuk **Nama peran**, tingkat penyesuaian nama peran ditentukan oleh layanan. Jika layanan mendefinisikan nama peran, maka opsi ini tidak dapat diedit. Dalam kasus lain, layanan mungkin menentukan awalan untuk peran dan memungkinkan Anda memasukkan akhiran opsional.

   Jika memungkinkan, masukkan akhiran nama peran untuk ditambahkan ke nama default. Akhiran ini membantu Anda mengidentifikasi tujuan peran ini. Nama peran harus unik di akun AWS Anda. Grup tidak dibedakan berdasarkan huruf besar-kecil. Misalnya, Anda tidak dapat membuat peran dengan nama **<service-linked-role-name>\$1SAMPLE** dan **<service-linked-role-name>\$1sample**. Anda tidak dapat mengubah nama peran setelah dibuat karena berbagai entitas mungkin mereferensikan peran tersebut.

1. (Opsional) Untuk **Deskripsi**, edit deskripsi untuk peran terkait layanan baru.

1. Anda tidak dapat melampirkan tag ke peran terkait layanan selama pembuatan. Untuk informasi selengkapnya tentang menggunakan tag di IAM, lihat [Tag untuk AWS Identity and Access Management sumber daya](id_tags.md).

1. Tinjau peran dan kemudian pilih **Buat peran**.

### Membuat peran terkait layanan (AWS CLI)
<a name="create-service-linked-role-iam-cli"></a>

Sebelum membuat peran terkait layanan di IAM, cari tahu apakah layanan tertaut secara otomatis membuat peran terkait layanan dan apakah Anda dapat membuat peran dari CLI layanan. Jika CLI layanan tidak didukung, Anda dapat menggunakan perintah IAM untuk membuat peran terkait layanan dengan kebijakan kepercayaan dan kebijakan sebaris yang diperlukan layanan untuk menjalankan peran tersebut.

**Untuk membuat peran terkait layanan ()AWS CLI**

Jalankan perintah berikut:

```
aws iam [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) --aws-service-name SERVICE-NAME.amazonaws.com
```

### Membuat peran terkait layanan (API)AWS
<a name="create-service-linked-role-iam-api"></a>

Sebelum membuat peran terkait layanan di IAM, cari tahu apakah layanan tertaut secara otomatis membuat peran terkait layanan dan apakah Anda dapat membuat peran dari API layanan. Jika API layanan tidak didukung, Anda dapat menggunakan AWS API untuk membuat peran terkait layanan dengan kebijakan kepercayaan dan kebijakan sebaris yang diperlukan layanan untuk mengambil peran tersebut.

**Untuk membuat peran terkait layanan (API)AWS **

Gunakan panggilan API [CreateServiceLinkedRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateServiceLinkedRole.html). Dalam permintaan, sebutkan nama layanan `SERVICE_NAME_URL.amazonaws.com`. 

Misalnya, untuk membuat peran terkait layanan **Lex Bots**, gunakan `lex.amazonaws.com`.

# Membuat peran untuk penyedia identitas pihak ketiga
<a name="id_roles_create_for-idp"></a>

Anda dapat menggunakan penyedia identitas alih-alih membuat pengguna IAM di situs Anda Akun AWS. Dengan penyedia identitas (iDP), Anda dapat mengelola identitas pengguna di luar AWS dan memberikan izin identitas pengguna eksternal ini untuk mengakses AWS sumber daya di akun Anda. Untuk informasi lebih lanjut tentang federasi dan penyedia identitas, lihat [Penyedia identitas dan federasi ke AWS](id_roles_providers.md).

## Membuat peran untuk prinsipal federasi OIDC dan SAMP (konsol)
<a name="roles-creatingrole-federated-users-console"></a>

Prosedur untuk membuat peran tergantung pada pilihan penyedia pihak ketiga Anda:
+ Untuk OpenID Connect (OIDC), lihat. [Buat peran untuk federasi OpenID Connect (konsol)](id_roles_create_for-idp_oidc.md)
+ Untuk SAML 2.0, lihat [Buat peran untuk federasi SAMP 2.0 (konsol)](id_roles_create_for-idp_saml.md).

## Membuat peran untuk akses gabungan (AWS CLI)
<a name="roles-creatingrole-identityprovider-cli"></a>

Langkah-langkah untuk membuat peran untuk penyedia identitas yang didukung (OIDC atau SAML) dari AWS CLI adalah identik. Perbedaannya ada dalam konten kebijakan kepercayaan yang Anda buat dalam langkah-langkah prasyarat. Mulai dengan mengikuti langkah-langkah dalam bagian **Prasyarat** untuk jenis penyedia yang Anda gunakan:
+ Untuk penyedia OIDC, lihat [Prasyarat untuk menciptakan peran untuk OIDC](id_roles_create_for-idp_oidc.md#idp_oidc_Prerequisites).
+ Untuk penyedia SAML, lihat [Prasyarat untuk membuat peran untuk SAML](id_roles_create_for-idp_saml.md#idp_saml_Prerequisites).

Membuat peran dari AWS CLI melibatkan beberapa langkah. Saat Anda menggunakan konsol untuk membuat peran, banyak langkah dilakukan untuk Anda, tetapi dengan itu AWS CLI Anda harus secara eksplisit melakukan setiap langkah sendiri. Anda harus membuat peran dan kemudian menetapkan kebijakan izin untuk peran tersebut. Atau, Anda juga dapat mengatur [batas izin](access_policies_boundaries.md) untuk peran Anda.

**Untuk membuat peran (AWS CLI)**

1. Buat peran: [aws iam create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html)

1. Lampirkan kebijakan izin ke peran: [aws](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html) iam attach-role-policy

    atau

   [Buat kebijakan izin sebaris untuk peran tersebut: aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html)

1. (Opsional) Tambahkan atribut khusus ke peran tersebut dengan melampirkan tag: [aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)

   Untuk informasi selengkapnya, lihat [Mengelola tag pada peran IAM (AWS CLI atau AWS API)](id_tags_roles.md#id_tags_roles_procs-cli-api).

1. [(Opsional) Tetapkan [batas izin](access_policies_boundaries.md) untuk peran: aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html)

   Batas izin mengontrol izin maksimum yang dapat dimiliki sebuah peran. Batas izin adalah AWS fitur lanjutan.

Contoh berikut menunjukkan dua langkah pertama, dan paling umum, untuk membuat peran penyedia identitas dalam lingkungan yang sederhana. Contoh ini memungkinkan setiap pengguna dalam akun `123456789012` untuk mengasumsikan peran dan melihat `example_bucket` bucket Amazon S3. Contoh ini juga mengasumsikan bahwa Anda menjalankan AWS CLI pada komputer yang menjalankan Windows, dan telah mengkonfigurasi AWS CLI dengan kredensi Anda. Untuk informasi selengkapnya, lihat [Mengonfigurasi AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html).

Contoh kebijakan kepercayaan berikut ini dirancang untuk aplikasi seluler jika pengguna masuk dengan menggunakan Amazon Cognito. Dalam contoh ini, *us-east:12345678-ffff-ffff-ffff-123456* mewakili ID kumpulan identitas yang ditetapkan oleh Amazon Cognito.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "RoleForCognito",
        "Effect": "Allow",
        "Principal": {"Federated": "cognito-identity.amazonaws.com"},
        "Action": "sts:AssumeRoleWithWebIdentity",
        "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}
    }
}
```

------

Kebijakan izin berikut ini memperbolehkan siapa pun yang mengasumsikan peran untuk hanya melaksanakan tindakan `ListBucket` pada `example_bucket` bucket Amazon S3.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::example_bucket"
  }
}
```

------

Untuk membuat peran ini `Test-Cognito-Role`, Anda harus terlebih dahulu menyimpan kebijakan kepercayaan sebelumnya dengan nama `trustpolicyforcognitofederation.json` dan kebijakan izin sebelumnya dengan nama `permspolicyforcognitofederation.json` ke `policies` direktori di lokasi Anda `C:`. Kemudian Anda dapat menggunakan perintah berikut untuk membuat peran dan melampirkan kebijakan inline.

```
# Create the role and attach the trust policy that enables users in an account to assume the role.
$ aws iam create-role --role-name Test-Cognito-Role --assume-role-policy-document file://C:\policies\trustpolicyforcognitofederation.json

# Attach the permissions policy to the role to specify what it is allowed to do.
aws iam put-role-policy --role-name Test-Cognito-Role --policy-name Perms-Policy-For-CognitoFederation --policy-document file://C:\policies\permspolicyforcognitofederation.json
```

## Membuat peran untuk akses federasi (AWS API)
<a name="roles-creatingrole-identityprovider-api"></a>

Langkah-langkah untuk membuat peran untuk penyedia identitas yang didukung (OIDC atau SAML) dari AWS CLI adalah identik. Perbedaannya ada dalam konten kebijakan kepercayaan yang Anda buat dalam langkah-langkah prasyarat. Mulai dengan mengikuti langkah-langkah dalam bagian **Prasyarat** untuk jenis penyedia yang Anda gunakan:
+ Untuk penyedia OIDC, lihat [Prasyarat untuk menciptakan peran untuk OIDC](id_roles_create_for-idp_oidc.md#idp_oidc_Prerequisites).
+ Untuk penyedia SAML, lihat [Prasyarat untuk membuat peran untuk SAML](id_roles_create_for-idp_saml.md#idp_saml_Prerequisites).

**Untuk membuat peran (AWS API)**

1. Buat peran: [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)

1. Lampirkan kebijakan izin pada peran: [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)

    atau

   Buat kebijakan izin inline untuk peran: [PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html)

1. (Opsional) Tambahkan atribut khusus ke pengguna dengan melampirkan tag: [TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)

   Untuk informasi selengkapnya, lihat [Mengelola tag pada pengguna IAM (AWS CLI atau AWS API)](id_tags_users.md#id_tags_users_procs-cli-api).

1. (Opsional) Tetapkan [batas izin](access_policies_boundaries.md) untuk peran tersebut: [PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html)

   Batas izin mengontrol izin maksimum yang dapat dimiliki sebuah peran. Batas izin adalah AWS fitur lanjutan.

# Buat peran untuk federasi OpenID Connect (konsol)
<a name="id_roles_create_for-idp_oidc"></a>

Anda dapat menggunakan penyedia identitas federasi OpenID Connect (OIDC) alih-alih membuat pengguna di penyedia identitas Anda. AWS Identity and Access Management Akun AWS Dengan penyedia identitas (iDP), Anda dapat mengelola identitas pengguna di luar AWS dan memberikan izin identitas pengguna eksternal ini untuk mengakses AWS sumber daya di akun Anda. Untuk informasi lebih lanjut tentang federasi dan IdPs, lihat[Penyedia identitas dan federasi ke AWS](id_roles_providers.md).

## Prasyarat untuk menciptakan peran untuk OIDC
<a name="idp_oidc_Prerequisites"></a>

Sebelum Anda dapat membuat peran untuk federasi OIDC, Anda harus terlebih dahulu menyelesaikan langkah-langkah prasyarat berikut.<a name="oidc-prereqs"></a>

**Untuk mempersiapkan diri untuk menciptakan peran untuk federasi OIDC**

1. Daftar dengan satu atau lebih layanan yang menawarkan identitas OIDC federasi. Jika Anda membuat aplikasi yang memerlukan akses ke AWS sumber daya, Anda juga mengonfigurasi aplikasi dengan informasi penyedia. Saat melakukannya, penyedia memberi Anda aplikasi atau ID audiens yang unik untuk aplikasi Anda. (Penyedia berbeda menggunakan terminologi berbeda untuk proses ini. Panduan ini menggunakan istilah *konfigurasi* untuk proses mengidentifikasi aplikasi Anda dengan penyedia.) Anda dapat mengonfigurasi beberapa aplikasi dengan setiap penyedia, atau beberapa penyedia dengan satu aplikasi. Lihat informasi tentang penggunaan penyedia identitas sebagai berikut:
   + [Login dengan Amazon Developer Center](https://login.amazon.com/)
   + [Tambahkan Login Facebook ke Aplikasi atau Website Anda](https://developers.facebook.com/docs/facebook-login/v2.1) di situs pengembang Facebook.
   + [Menggunakan OAuth 2.0 untuk Login (OpenID Connect)](https://developers.google.com/accounts/docs/OAuth2Login) di situs pengembang Google.

1. <a name="idpoidcstep2"></a>Setelah Anda menerima informasi yang diperlukan dari iDP, buat iDP di IAM. Untuk informasi selengkapnya, lihat [Buat penyedia identitas OpenID Connect (OIDC) di IAM](id_roles_providers_create_oidc.md).
**penting**  
Jika Anda menggunakan IdP OIDC dari Google, Facebook, atau Amazon Cognito, jangan buat iDP IAM terpisah di file. Konsol Manajemen AWS Penyedia identitas OIDC ini sudah dibangun AWS dan tersedia untuk Anda gunakan. Lewati langkah ini dan buat peran baru menggunakan IDP Anda di langkah berikut.

1. Persiapkan kebijakan untuk peran yang akan diaambil oleh pengguna yang diotentikasi IdP. Sebagaimana peran apa pun, peran untuk aplikasi seluler mencakup dua kebijakan. Salah satunya adalah kebijakan kepercayaan yang menentukan siapa yang dapat mengasumsikan peran tersebut. Lainnya adalah kebijakan izin yang menentukan tindakan AWS dan sumber daya yang diperbolehkan atau ditolak untuk diakses aplikasi seluler.

   Untuk web IdPs, kami menyarankan Anda menggunakan [Amazon Cognito](https://aws.amazon.com/cognito/) untuk mengelola identitas. Dalam hal ini, gunakan kebijakan kepercayaan yang serupa dengan contoh ini.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"Federated": "cognito-identity.amazonaws.com"},
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
               "StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east-2:12345678-abcd-abcd-abcd-123456"},
               "ForAnyValue:StringLike": {"cognito-identity.amazonaws.com:amr": "unauthenticated"}
           }
       }
   }
   ```

------

   Ganti `us-east-2:12345678-abcd-abcd-abcd-123456` dengan ID kumpulan identitas yang diberikan Amazon Cognito kepada Anda.

   Jika Anda mengonfigurasi IdP OIDC secara manual, saat membuat kebijakan kepercayaan, Anda harus menggunakan tiga nilai yang memastikan bahwa hanya aplikasi yang dapat mengambil peran tersebut:
   + Untuk elemen `Action`, gunakan tindakan `sts:AssumeRoleWithWebIdentity`.
   + Untuk elemen `Principal`, gunakan string `{"Federated":providerUrl/providerArn}`.
     + Untuk beberapa OIDC umum IdPs, itu `providerUrl` adalah URL. Contoh berikut termasuk metode untuk menentukan prinsip untuk beberapa umum IdPs:

       `"Principal":{"Federated":"cognito-identity.amazonaws.com"}`

       `"Principal":{"Federated":"www.amazon.com"}`

       `"Principal":{"Federated":"graph.facebook.com"}`

       `"Principal":{"Federated":"accounts.google.com"}`
     + Untuk penyedia OIDC lainnya, gunakan Nama Sumber Daya Amazon (ARN) dari IDP OIDC yang Anda buat, seperti contoh berikut: [Step 2](#idpoidcstep2)

       `"Principal":{"Federated":"arn:aws:iam::123456789012:oidc-provider/server.example.com"}`
   + Untuk elemen `Condition` , gunakan syarat `StringEquals` untuk membatasi izin. Uji ID kumpulan identitas untuk Amazon Cognito) atau ID aplikasi untuk penyedia lain. ID kumpulan identitas harus sesuai dengan ID aplikasi yang Anda terima saat mengonfigurasi aplikasi dengan iDP. Pencocokan antara IDs memastikan bahwa permintaan berasal dari aplikasi Anda.
**catatan**  
Peran IAM untuk kumpulan identitas Amazon Cognito mempercayai `cognito-identity.amazonaws.com` kepala layanan untuk mengambil peran tersebut. Peran jenis ini harus mengandung setidaknya satu kunci kondisi untuk membatasi kepala sekolah yang dapat mengambil peran tersebut.  
Pertimbangan tambahan berlaku untuk kumpulan identitas Amazon Cognito yang mengambil peran IAM [lintas akun](access_policies-cross-account-resource-access.md). Kebijakan kepercayaan dari peran ini harus menerima prinsip `cognito-identity.amazonaws.com` layanan dan harus berisi kunci `aud` kondisi untuk membatasi asumsi peran bagi pengguna dari kumpulan identitas yang Anda inginkan. Kebijakan yang mempercayai kumpulan identitas Amazon Cognito tanpa kondisi ini menimbulkan risiko bahwa pengguna dari kumpulan identitas yang tidak diinginkan dapat mengambil peran tersebut. Untuk informasi selengkapnya, lihat [Kebijakan kepercayaan untuk peran IAM dalam autentikasi Dasar (Klasik) di Panduan](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#trust-policies) Pengembang *Amazon Cognito*.

     Buat elemen kondisi yang mirip dengan salah satu contoh berikut, tergantung pada idP yang Anda gunakan: 

     `"Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}`

     `"Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}`

     `"Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}`

     `"Condition": {"StringEquals": {"accounts.google.com:aud": "66677788899900pro0"}}`

     Untuk penyedia OIDC, gunakan URL IdP OIDC yang memenuhi syarat sepenuhnya dengan kunci konteks `aud`, seperti contoh berikut: 

     `"Condition": {"StringEquals": {"server.example.com:aud": "appid_from_oidc_idp"}}`
**catatan**  
Nilai-nilai untuk kepala sekolah dalam kebijakan kepercayaan untuk peran tersebut spesifik untuk IDP. Peran untuk OIDC hanya dapat menentukan satu prinsipal. Oleh karena itu, jika aplikasi seluler memungkinkan pengguna untuk masuk dari lebih dari satu iDP, buat peran terpisah untuk setiap IDP yang ingin Anda dukung. Buat kebijakan kepercayaan terpisah untuk setiap IDP.

   Jika pengguna menggunakan aplikasi seluler untuk masuk dari Login with Amazon, contoh kebijakan kepercayaan berikut akan berlaku. Dalam contoh, *amzn1.application-oa2-123456* mewakili ID aplikasi yang ditetapkan Amazon saat Anda mengonfigurasi aplikasi menggunakan Login with Amazon.

------
#### [ JSON ]

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForLoginWithAmazon",
             "Effect": "Allow",
             "Principal": {"Federated": "www.amazon.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}
         }]
     }
   ```

------

   Jika pengguna menggunakan aplikasi seluler untuk masuk dari Facebook, contoh kebijakan kepercayaan berikut akan berlaku. Dalam contoh ini, *111222333444555* mewakili ID aplikasi yang ditetapkan Facebook.

------
#### [ JSON ]

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForFacebook",
             "Effect": "Allow",
             "Principal": {"Federated": "graph.facebook.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}
         }]
     }
   ```

------

   Jika pengguna menggunakan aplikasi seluler untuk masuk dari Google, contoh kebijakan kepercayaan berikut akan berlaku. Dalam contoh ini, *666777888999000* mewakili ID aplikasi yang ditetapkan Google.

------
#### [ JSON ]

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForGoogle",
             "Effect": "Allow",
             "Principal": {"Federated": "accounts.google.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"accounts.google.com:aud": "666777888999000"}}
         }]
     }
   ```

------

   Jika pengguna menggunakan aplikasi seluler untuk masuk dari Amazon Cognito, contoh kebijakan kepercayaan berikut akan berlaku. Dalam contoh ini, *us-east:12345678-ffff-ffff-ffff-123456* mewakili ID kumpulan identitas yang ditetapkan Amazon Cognito.

------
#### [ JSON ]

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForCognito",
             "Effect": "Allow",
             "Principal": {"Federated": "cognito-identity.amazonaws.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}
         }]
     }
   ```

------

## Menciptakan peran untuk OIDC
<a name="idp_oidc_Create"></a>

Setelah Anda menyelesaikan prasyarat, Anda dapat membuat peran dalam IAM. *Untuk penyedia identitas OpenID Connect (OIDC) bersama yang diakui (IdPs), IAM memerlukan evaluasi eksplisit atas klaim spesifik dalam JSON Web Tokens () yang dikenal sebagai kontrol penyedia identitas. JWTs* Untuk informasi selengkapnya tentang OIDC mana yang IdPs memiliki kontrol penyedia *identitas*, lihat. [Kontrol penyedia identitas untuk penyedia OIDC bersama](id_roles_providers_oidc_secure-by-default.md)

Prosedur berikut menjelaskan cara membuat peran untuk federasi OIDC di. Konsol Manajemen AWS Untuk membuat peran dari AWS CLI atau AWS API, lihat prosedur di[Membuat peran untuk penyedia identitas pihak ketiga](id_roles_create_for-idp.md).

**penting**  
Jika Anda menggunakan Amazon Cognito, gunakan konsol Amazon Cognito untuk mengatur peran. Jika tidak, gunakan konsol IAM untuk membuat peran federasi OIDC.

**Untuk membuat peran IAM untuk federasi OIDC**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Pada panel navigasi, silakan pilih **Peran** lalu pilih **Buat peran**.

1. Pilih **identitas Web** sebagai jenis entitas tepercaya dan pilih **Berikutnya**.

1. Untuk **penyedia Identity**, pilih IDP untuk peran Anda: 
   + **Jika Anda ingin membuat peran untuk IDP web individual, pilih **Login with Amazon**, **Facebook**, atau Google.** 
**catatan**  
Anda harus membuat peran terpisah untuk setiap IDP yang ingin Anda dukung.
   + Jika Anda ingin membuat peran skenario lanjutan untuk Amazon Cognito, pilih Amazon **Cognito**. 
**catatan**  
Anda harus membuat peran secara manual untuk digunakan dengan Amazon Cognito hanya ketika Anda mengerjakan skenario lanjutan. Jika tidak, Amazon Cognito dapat membuat peran untuk Anda. *Untuk informasi selengkapnya tentang Amazon Cognito, lihat [Penyedia identitas eksternal kumpulan identitas (identitas gabungan)](https://docs.aws.amazon.com/cognito/latest/developerguide/external-identity-providers.html) di Panduan Pengembang Amazon Cognito.* 
   + Jika Anda ingin membuat peran untuk GitHub Tindakan, Anda harus mulai dengan menambahkan penyedia GitHub OIDC ke IAM. **Setelah Anda menambahkan penyedia GitHub OIDC ke IAM, pilih token.actions.githubusercontent.com.** 
**catatan**  
Untuk informasi tentang cara AWS mengonfigurasi penyedia OIDC trust GitHub sebagai identitas gabungan, lihat [GitHub Dokumen - Mengonfigurasi OpenID Connect di](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services) Amazon Web Services. Untuk informasi tentang praktik terbaik untuk membatasi akses untuk peran yang terkait dengan IDP IAM GitHub untuk, [Mengkonfigurasi peran untuk penyedia identitas GitHub OIDC](#idp_oidc_Create_GitHub) lihat di halaman ini.
   + Jika Anda ingin membuat peran untuk HashiCorp Cloud Platform (HCP) Terraform, Anda harus mulai dengan menambahkan penyedia Terraform OIDC ke IAM. **Setelah Anda menambahkan penyedia Terraform OIDC ke IAM, pilih app.terraform.io.** 
**penting**  
Peran IAM untuk penyedia HashiCorp Cloud Platform (HCP) Terraform OIDC harus mengevaluasi kunci kondisi IAM,, `app.terraform.io:sub` dalam kebijakan kepercayaan peran. Kunci kondisi ini membatasi organisasi, proyek, ruang kerja, atau fase lari HCP Terraform yang dapat mengambil peran tersebut. Tanpa kunci kondisi ini, kebijakan kepercayaan Anda memberikan akses ke peran dan AWS sumber daya Anda dengan identitas di luar organisasi Anda, yang tidak sejalan dengan prinsip hak istimewa paling sedikit.   
Jika Anda menetapkan atau mengubah kebijakan kepercayaan peran untuk peran yang terkait dengan penyedia HCP Terraform OIDC di AWS akun Anda, tetapi tidak mengevaluasi kunci kondisi IAM`app.terraform.io:sub`, Anda akan menerima kesalahan. Selain itu, AWS STS akan menolak permintaan otorisasi jika kebijakan kepercayaan peran Anda tidak mengevaluasi kunci kondisi ini.

1. Informasi yang diminta bervariasi berdasarkan penyedia OIDC yang Anda pilih.
   + Masukkan pengenal untuk aplikasi Anda. Label pengenal berubah berdasarkan penyedia yang Anda pilih:
     + Jika Anda ingin membuat peran untuk Login with Amazon, masukkan ID aplikasi ke dalam kotak **ID Aplikasi**.
     + Jika Anda ingin membuat peran untuk Facebook, masukkan ID aplikasi ke dalam kotak **ID Aplikasi**.
     + Jika Anda ingin membuat peran untuk Google, masukkan nama audiens ke dalam kotak **Audiens**.
     + Jika Anda ingin membuat peran untuk Amazon Cognito, masukkan ID kumpulan identitas yang telah Anda buat untuk aplikasi Amazon Cognito ke dalam kotak ID Kumpulan **Identitas**.
   + Jika Anda ingin membuat peran untuk GitHub Tindakan, masukkan detail berikut:
     + Untuk **Audiens**, pilih `sts.amazonaws.com`.
     + Untuk **GitHub organisasi**, masukkan nama GitHub organisasi. Nama GitHub organisasi diperlukan dan harus alfanumerik termasuk tanda hubung (-). Anda tidak dapat menggunakan karakter wildcard (\$1 dan?) dalam nama GitHub organisasi.
     + (Opsional) Untuk **GitHub repositori**, masukkan nama GitHub repositori. Jika Anda tidak menentukan nilai, itu default ke wildcard (). `*`
     + (Opsional) Untuk **GitHub cabang**, masukkan nama GitHub cabang. Jika Anda tidak menentukan nilai, itu default ke wildcard (). `*`
   + Jika Anda ingin membuat peran untuk HashiCorp Cloud Platform (HCP) Terraform, masukkan detail berikut:
     + Untuk **Audiens**, pilih `aws.workload.identity`.
     + Untuk **Organisasi**, masukkan nama organisasi. Anda dapat menentukan karakter wildcard (`*`) untuk semua organisasi.
     + Untuk **Project**, masukkan nama proyek. Anda dapat menentukan karakter wildcard (`*`) untuk semua proyek.
     + Untuk **Workspace**, masukkan nama ruang kerja. Anda dapat menentukan karakter wildcard (`*`) untuk semua ruang kerja.
     + Untuk **Run Phase**, masukkan nama fase run. Anda dapat menentukan karakter wildcard (`*`) untuk semua fase run.

1. (Opsional) Untuk **Kondisi (opsional)**, pilih **Tambahkan Kondisi** untuk membuat kondisi tambahan yang harus dipenuhi sebelum pengguna aplikasi Anda dapat menggunakan izin yang diberikan peran. Misalnya, Anda dapat menambahkan kondisi yang memberikan akses ke AWS sumber daya hanya untuk ID pengguna IAM tertentu. Anda juga dapat menambahkan ketentuan ke kebijakan kepercayaan setelah peran dibuat. Untuk informasi selengkapnya, lihat [Memperbarui kebijakan kepercayaan peran](id_roles_update-role-trust-policy.md).

1. **Tinjau informasi OIDC Anda dan kemudian pilih Berikutnya.**

1. IAM menyertakan daftar kebijakan yang AWS dikelola dan dikelola pelanggan di akun Anda. Pilih kebijakan yang akan digunakan untuk kebijakan izin, atau pilih **Buat kebijakan** untuk membuka tab browser baru dan membuat kebijakan baru dari awal. Untuk informasi selengkapnya, lihat [Membuat kebijakan IAM](access_policies_create-console.md#access_policies_create-start). Setelah Anda membuat kebijakan, tutup tab tersebut dan kembali ke tab asli Anda. Pilih kotak centang di samping kebijakan izin yang ingin dimiliki pengguna OIDC. Jika Anda lebih suka, Anda boleh tidak memilih kebijakan saat ini, kemudian melampirkan kebijakan kepada peran di lain waktu. Secara default, peran tidak memiliki izin.

1. (Opsional) Tetapkan [batas izin](access_policies_boundaries.md). Ini adalah fitur lanjutan.

   Buka bagian **batas izin dan pilih Gunakan batas** **izin untuk mengontrol izin peran maksimum**. Pilih kebijakan yang akan digunakan untuk batas izin.

1. Pilih **Berikutnya**.

1. Untuk **Nama peran**, masukkan nama peran. Nama peran harus unik di dalam diri Anda Akun AWS. Mereka tidak bergantung pada kasus. Misalnya, Anda tidak dapat membuat peran bernama keduanya **PRODROLE** dan**prodrole**. Karena AWS sumber daya lain mungkin mereferensikan peran, Anda tidak dapat mengedit nama peran setelah membuatnya.

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi untuk peran baru ini.

1. Untuk mengedit kasus penggunaan dan izin untuk peran, pilih **Edit** di **Langkah 1: Pilih entitas tepercaya** atau **Langkah 2: Tambahkan izin** bagian. 

1. (Opsional) Untuk menambahkan metadata ke peran, lampirkan tag sebagai pasangan kunci-nilai. Untuk informasi selengkapnya tentang menggunakan tanda di IAM, lihat [Tag untuk AWS Identity and Access Management sumber daya](id_tags.md).

1. Tinjau peran, lalu pilih **Buat peran**.

## Mengkonfigurasi peran untuk penyedia identitas GitHub OIDC
<a name="idp_oidc_Create_GitHub"></a>

Jika Anda menggunakan GitHub sebagai penyedia identitas OpenID Connect (OIDC) (IDP), praktik terbaik adalah membatasi entitas yang dapat mengambil peran yang terkait dengan IDP IAM. Bila Anda menyertakan pernyataan kondisi dalam kebijakan kepercayaan, Anda dapat membatasi peran ke GitHub organisasi, repositori, atau cabang tertentu. Anda dapat menggunakan kunci kondisi `token.actions.githubusercontent.com:sub` dengan operator kondisi string untuk membatasi akses. Kami menyarankan Anda membatasi kondisi ke kumpulan repositori atau cabang tertentu dalam organisasi Anda GitHub . Untuk informasi tentang cara AWS mengonfigurasi OIDC trust GitHub sebagai identitas federasi, lihat [GitHub Dokumen - Mengonfigurasi OpenID Connect di](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services) Amazon Web Services. 

Jika Anda menggunakan GitHub lingkungan dalam alur kerja tindakan atau dalam kebijakan OIDC, kami sangat menyarankan untuk menambahkan aturan perlindungan ke lingkungan untuk keamanan tambahan. Gunakan cabang dan tag penyebaran untuk membatasi cabang dan tag mana yang dapat diterapkan ke lingkungan. Untuk informasi selengkapnya tentang mengonfigurasi lingkungan dengan aturan perlindungan, lihat [Cabang dan tag penerapan](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#deployment-branches-and-tags) di GitHub artikel *Menggunakan lingkungan untuk penerapan*.

Kapan GitHub OIDC iDP adalah Principal tepercaya untuk peran Anda, IAM memeriksa kondisi kebijakan kepercayaan peran untuk memverifikasi bahwa kunci kondisi `token.actions.githubusercontent.com:sub` ada dan bahwa nilainya bukan semata-mata karakter wildcard (\$1 dan?) atau null. IAM melakukan pemeriksaan ini ketika kebijakan kepercayaan dibuat atau diperbarui. Jika kunci kondisi tidak `token.actions.githubusercontent.com:sub` ada, atau nilai kunci tidak memenuhi kriteria nilai yang disebutkan, permintaan akan gagal dan mengembalikan kesalahan.

**penting**  
Jika Anda tidak membatasi kunci kondisi `token.actions.githubusercontent.com:sub` untuk organisasi atau repositori tertentu, maka GitHub Tindakan dari organisasi atau repositori di luar kendali Anda dapat mengambil peran yang terkait dengan GitHub IDP IAM di akun Anda. AWS 

Contoh kebijakan kepercayaan berikut membatasi akses ke GitHub organisasi, repositori, dan cabang yang ditentukan. `token.actions.githubusercontent.com:sub`Nilai kunci kondisi dalam contoh berikut adalah format nilai subjek default yang didokumentasikan oleh GitHub.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::012345678910:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
          "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:ref:refs/heads/GitHubBranch"
        }
      }
    }
  ]
}
```

------

Contoh kondisi berikut membatasi akses ke GitHub organisasi dan repositori yang ditentukan, tetapi memberikan akses ke cabang mana pun dalam repositori.

```
"Condition": {
  "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
  },
  "StringLike": {    
    "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:*"
  }
}
```

Contoh kondisi berikut membatasi akses ke repositori atau cabang apa pun dalam organisasi yang ditentukan GitHub . Kami menyarankan Anda membatasi kunci kondisi `token.actions.githubusercontent.com:sub` ke nilai tertentu yang membatasi akses ke GitHub Tindakan dari dalam GitHub organisasi Anda.

```
"Condition": {
  "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
  },
  "StringLike": {    
    "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/*"
  }
}
```

Untuk informasi selengkapnya tentang kunci federasi OIDC yang tersedia untuk pemeriksaan kondisi dalam kebijakan, lihat. [Kunci yang tersedia untuk AWS federasi OIDC](reference_policies_iam-condition-keys.md#condition-keys-wif)

# Buat peran untuk federasi SAMP 2.0 (konsol)
<a name="id_roles_create_for-idp_saml"></a>

 Anda dapat menggunakan federasi SAMP 2.0 alih-alih membuat pengguna IAM di file Anda. Akun AWS Dengan penyedia identitas (iDP), Anda dapat mengelola identitas pengguna di luar AWS dan memberikan izin identitas pengguna eksternal ini untuk mengakses AWS sumber daya di akun Anda. Untuk informasi lebih lanjut tentang federasi dan penyedia identitas, lihat [Penyedia identitas dan federasi ke AWS](id_roles_providers.md).

**catatan**  
Untuk meningkatkan ketahanan federasi, kami menyarankan Anda mengonfigurasi IDP dan AWS federasi Anda untuk mendukung beberapa titik akhir masuk SAMP. Untuk detailnya, lihat artikel Blog AWS Keamanan [Cara menggunakan endpoint SAMP regional untuk](https://aws.amazon.com/blogs//security/how-to-use-regional-saml-endpoints-for-failover) failover.

## Prasyarat untuk membuat peran untuk SAML
<a name="idp_saml_Prerequisites"></a>

Sebelum Anda dapat membuat peran untuk federasi SAMP 2.0, Anda harus terlebih dahulu menyelesaikan langkah-langkah prasyarat berikut.<a name="saml-prereqs"></a>

**Untuk mempersiapkan pembuatan peran federasi SAML 2.0**

1. <a name="idpsamlstep1"></a>Sebelum Anda membuat peran untuk federasi berbasis SAML, Anda harus membuat penyedia SAML di IAM. Untuk informasi selengkapnya, lihat [Buat penyedia identitas SAMP di IAM](id_roles_providers_create_saml.md).

1. Persiapkan kebijakan untuk peran yang akan diasumsikan oleh pengguna yang diotentikasi–SAML 2.0. Sebagaimana peran apa pun, peran untuk federasi SAML mencakup dua kebijakan. Salah satunya adalah kebijakan kepercayaan peran yang dapat mengasumsikan peran. Yang lainnya adalah kebijakan izin IAM yang menentukan AWS tindakan dan sumber daya yang diizinkan atau ditolak aksesnya oleh prinsipal federasi SAMP.

   Ketika Anda membuat kebijakan kepercayaan untuk peran Anda, Anda harus menggunakan tiga nilai untuk memastikan bahwa hanya aplikasi Anda yang dapat mengambil peran:
   + Untuk elemen `Action`, gunakan tindakan `sts:AssumeRoleWithSAML`.
   + Untuk elemen `Principal`, gunakan string `{"Federated":ARNofIdentityProvider}`. Mengganti `ARNofIdentityProvider` dengan ARN [penyedia identitas SAML](id_roles_providers_saml.md) yang Anda buat di [Step 1](#idpsamlstep1).
   + Untuk `Condition` elemen, gunakan `StringEquals` kondisi untuk menguji apakah `saml:aud` atribut dari respons SAMP cocok dengan URL yang ditampilkan browser Anda saat masuk ke konsol. URL titik akhir masuk ini adalah atribut penerima SAMP penyedia identitas Anda. Anda dapat menyertakan login URLs dalam wilayah tertentu. AWS merekomendasikan penggunaan titik akhir Regional alih-alih titik akhir global untuk meningkatkan ketahanan federasi. Untuk daftar *region-code* nilai yang mungkin, lihat kolom **Wilayah** di titik [akhir AWS Masuk](https://docs.aws.amazon.com/general/latest/gr/signin-service.html).

     Jika enkripsi SAMP diperlukan, URL masuk harus menyertakan pengenal unik yang ditetapkan ke penyedia AWS SAMP Anda. Anda dapat melihat pengenal unik dengan memilih penyedia identitas di konsol IAM untuk menampilkan halaman detail.

     `https://region-code.signin.aws.amazon.com/saml/acs/IdP-ID`

   Contoh kebijakan kepercayaan berikut ini dirancang untuk pengguna federasi SAML:

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRoleWithSAML",
           "Principal": {
               "Federated": "arn:aws:iam::111122223333:saml-provider/PROVIDER-NAME"
           },
           "Condition": {
               "StringEquals": {
                   "SAML:aud": "https://region-code.signin.aws.amazon.com/saml"
               }
           }
       }
   }
   ```

------

   Ganti ARN prinsipal dengan ARN aktual untuk penyedia SAML yang Anda buat di IAM. Itu akan memiliki ID akun dan nama penyedia Anda sendiri. 

## Membuat peran untuk SAML
<a name="idp_saml_Create"></a>

Setelah Anda menyelesaikan langkah-langkah persyaratan, Anda dapat membuat peran untuk federasi berbasis SAML. 

**Untuk membuat peran untuk federasi berbasis SAML**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi konsol IAM, pilih **Peran** lalu pilih **Buat peran**.

1. Pilih jenis peran **federasi SAML 2.0**.

1. Untuk **Pilih penyedia SAMP**, pilih penyedia untuk peran Anda. 

1. Pilih metode tingkat akses SAML 2.0. 
   + Pilih **Izinkan akses terprogram hanya** untuk membuat peran yang dapat diasumsikan secara terprogram dari API atau. AWS AWS CLI
   + Pilih **Izinkan programatik dan Konsol Manajemen AWS akses** untuk membuat peran yang dapat diasumsikan secara terprogram dan dari. Konsol Manajemen AWS

   Peran yang dibuat oleh keduanya serupa, tetapi peran yang juga dapat diasumsikan dari konsol mencakup suatu kebijakan kepercayaan dengan syarat tertentu. Kondisi itu secara eksplisit memastikan bahwa audiens SAMP (`SAML:aud`atribut) disetel ke titik akhir AWS masuk untuk penyedia SAMP Anda.

1. Prosedur untuk mendefinisikan atribut bervariasi tergantung pada jenis akses.
   + Jika Anda membuat peran untuk akses terprogram, pilih atribut dari daftar **Atribut**. Kemudian, di kotak **Nilai**, masukkan nilai untuk disertakan dalam peran. Hal ini membatasi akses peran kepada pengguna dari penyedia identitas yang memiliki respon otentikasi SAML (pernyataan) mencakup atribut yang Anda tentukan. Anda harus menentukan setidaknya satu atribut untuk memastikan bahwa peran Anda terbatas pada subset pengguna dalam organisasi Anda. 
   + Jika Anda membuat peran untuk programatik dan Konsol Manajemen AWS akses, bagian **Titik akhir Masuk** menentukan URL yang ditampilkan browser Anda saat masuk ke konsol. Titik akhir ini adalah atribut penerima SAMP penyedia identitas Anda, yang memetakan ke kunci [`saml:aud`](reference_policies_iam-condition-keys.md#condition-keys-saml)konteks. Untuk informasi selengkapnya, lihat [Konfigurasikan pernyataan SAMP untuk respons otentikasi](id_roles_providers_create_saml_assertions.md).

     1. Pilih Endpoint **Regional atau Endpoint** **Non-Regional**. Kami merekomendasikan penggunaan beberapa titik akhir masuk SAMP Regional untuk meningkatkan ketahanan federasi.

     1. Untuk **Wilayah**, pilih wilayah yang didukung penyedia SAMP Anda untuk AWS login.

     1.  ** URLs Agar login menyertakan pengidentifikasi unik**, pilih apakah titik akhir masuk menyertakan pengidentifikasi unik yang ditetapkan ke penyedia identitas AWS SAMP Anda. Opsi ini diperlukan untuk pernyataan SAMP terenkripsi. Untuk informasi selengkapnya, lihat [Federasi SAMP 2.0](id_roles_providers_saml.md).

1. Untuk menambahkan lebih banyak kondisi terkait atribut ke kebijakan trust, pilih **Kondisi (opsional)**, pilih kondisi tambahan, dan tentukan nilai. 
**catatan**  
Daftar ini mencakup atribut SAML yang paling umum digunakan. IAM mendukung atribut tambahan yang dapat Anda gunakan untuk membuat persyaratan. Untuk daftar atribut didukung, lihat [Kunci yang Tersedia untuk Federasi SAML](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-saml). Jika Anda memerlukan syarat untuk atribut SAML yang didukung yang tidak ada dalam daftar, Anda dapat menambahkan syarat tersebut secara manual. Untuk melakukannya, ubah kebijakan kepercayaan setelah Anda membuat peran tersebut.

1.  Tinjau informasi kepercayaan SAMP 2.0 Anda dan kemudian pilih **Berikutnya**. 

1. IAM menyertakan daftar kebijakan yang AWS dikelola dan dikelola pelanggan di akun Anda. Pilih kebijakan yang akan digunakan untuk kebijakan izin, atau pilih **Buat kebijakan** untuk membuka tab browser baru dan membuat kebijakan baru dari awal. Untuk informasi selengkapnya, lihat [Membuat kebijakan IAM](access_policies_create-console.md#access_policies_create-start). Setelah Anda membuat kebijakan, tutup tab tersebut dan kembali ke tab asli Anda. Pilih kotak centang di samping kebijakan izin yang Anda inginkan untuk dimiliki oleh pengguna federasi SAMP. Jika Anda lebih suka, Anda boleh tidak memilih kebijakan saat ini, kemudian melampirkan kebijakan kepada peran di lain waktu. Secara default, peran tidak memiliki izin.

1. (Opsional) Tetapkan [batas izin](access_policies_boundaries.md). Ini adalah fitur lanjutan.

   Buka bagian **batas izin dan pilih Gunakan batas** **izin untuk mengontrol izin peran maksimum**. Pilih kebijakan yang akan digunakan untuk batas izin.

1. Pilih **Berikutnya**.

1. Pilih **Berikutnya: Tinjauan**.

1. Untuk **Nama peran**, masukkan nama peran. Nama peran harus unik dalam diri Anda Akun AWS. Grup tidak dibedakan berdasarkan huruf besar-kecil. Misalnya, Anda tidak dapat membuat peran dengan nama **PRODROLE** dan **prodrole**. Karena AWS sumber daya lain mungkin merujuk peran, Anda tidak dapat mengedit nama peran setelah dibuat. 

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi untuk peran baru ini.

1. Pilih **Edit** di **Langkah 1: Pilih entitas tepercaya** atau **Langkah 2: Tambahkan bagian izin** untuk mengedit kasus penggunaan dan izin untuk peran tersebut. 

1. (Opsional) Tambahkan metadata ke peran dengan melampirkan tag sebagai pasangan nilai kunci. Untuk informasi selengkapnya tentang menggunakan tag di IAM, lihat [Tag untuk AWS Identity and Access Management sumber daya](id_tags.md).

1. Tinjau peran, lalu pilih **Buat peran**.

Setelah membuat peran tersebut, Anda menyelesaikan kepercayaan SAML dengan mengonfigurasi perangkat lunak penyedia identitas dengan informasi tentang AWS. Informasi ini mencakup peran yang Anda inginkan untuk digunakan oleh pengguna federasi SAMP Anda. Ini disebut sebagai mengonfigurasi kepercayaan pihak pengandal antara Idp dan AWS. Lihat informasi yang lebih lengkap di [Konfigurasikan IDP SAMP 2.0 Anda dengan mengandalkan kepercayaan pihak dan menambahkan klaim](id_roles_providers_create_saml_relying-party.md). 

# Membuat peran menggunakan kebijakan kepercayaan khusus
<a name="id_roles_create_for-custom"></a>

Anda dapat membuat kebijakan kepercayaan khusus untuk mendelegasikan akses dan mengizinkan orang lain melakukan tindakan di situs Anda Akun AWS. Untuk informasi selengkapnya, lihat [Membuat kebijakan IAM](access_policies_create-console.md#access_policies_create-start).

Untuk informasi tentang cara menggunakan peran untuk mendelegasikan izin, lihat [Istilah dan konsep peran](id_roles.md#id_roles_terms-and-concepts).

## Membuat peran IAM menggunakan kebijakan kepercayaan khusus (konsol)
<a name="roles-creatingrole-custom-trust-policy-console"></a>

Anda dapat menggunakan Konsol Manajemen AWS untuk membuat peran yang dapat diasumsikan oleh pengguna IAM. Misalnya, asumsikan bahwa organisasi Anda memiliki banyak Akun AWS untuk mengisolasi lingkungan pengembangan dari lingkungan produksi. Untuk informasi tingkat tinggi tentang membuat peran yang memungkinkan pengguna di akun pengembangan mengakses sumber daya di akun produksi, lihat[Contoh skenario menggunakan akun pengembangan dan produksi terpisah](id_roles_common-scenarios_aws-accounts.md#id_roles_common-scenarios_aws-accounts-example).

**Untuk membuat peran menggunakan kebijakan kepercayaan khusus (konsol)**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi konsol, pilih **Peran** dan kemudian pilih **Buat peran**.

1. Pilih jenis peran **kebijakan kepercayaan kustom**.

1. Di bagian **Kebijakan kepercayaan khusus**, masukkan atau tempel kebijakan kepercayaan khusus untuk peran tersebut. Untuk informasi selengkapnya, lihat [Membuat kebijakan IAM](access_policies_create-console.md#access_policies_create-start).

1. Selesaikan peringatan keamanan, kesalahan, atau peringatan umum yang dihasilkan selama [validasi kebijakan](access_policies_policy-validator.md), lalu pilih **Berikutnya**.

1. (Opsional) Tetapkan [batas izin](access_policies_boundaries.md). Ini adalah fitur lanjutan yang tersedia untuk peran layanan, tetapi bukan peran tertaut layanan.

   Buka bagian **batas izin dan pilih Gunakan batas** **izin untuk mengontrol izin peran maksimum**. IAM menyertakan daftar kebijakan yang AWS dikelola dan dikelola pelanggan di akun Anda. Pilih kebijakan yang akan digunakan untuk batas izin.

1. Pilih **Berikutnya**.

1. Untuk **Nama peran**, tingkat penyesuaian nama peran ditentukan oleh layanan. Jika layanan mendefinisikan nama peran, opsi ini tidak dapat diedit. Dalam kasus lain, layanan mungkin menentukan awalan peran dan memungkinkan Anda untuk memasukkan akhiran opsional. Beberapa layanan memungkinkan Anda untuk menentukan seluruh nama peran Anda.

   Jika memungkinkan, masukkan nama peran atau akhiran nama peran. Nama peran harus unik di dalam diri Anda Akun AWS. Grup tidak dibedakan berdasarkan huruf besar-kecil. Misalnya, Anda tidak dapat membuat peran dengan nama **PRODROLE** dan **prodrole**. Karena AWS sumber daya lain mungkin mereferensikan peran, Anda tidak dapat mengedit nama peran setelah dibuat.

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi untuk peran baru ini.

1. (Opsional) Pilih **Edit** di **Langkah 1: Pilih entitas tepercaya** atau **Langkah 2: Tambahkan izin** bagian untuk mengedit kebijakan kustom dan izin untuk peran tersebut. 

1. (Opsional) Tambahkan metadata ke peran dengan melampirkan tag sebagai pasangan nilai kunci. Untuk informasi selengkapnya tentang menggunakan tag di IAM, lihat [Tag untuk AWS Identity and Access Management sumber daya](id_tags.md).

1. Tinjau peran dan kemudian pilih **Buat peran**.

# Contoh kebijakan untuk mendelegasikan akses
<a name="id_roles_create_policy-examples"></a>

Contoh berikut menunjukkan bagaimana Anda dapat mengizinkan atau memberikan Akun AWS akses ke sumber daya di sumber lain Akun AWS. Untuk mempelajari cara membuat kebijakan IAM dengan menggunakan contoh dokumen kebijakan JSON ini, lihat [Membuat kebijakan menggunakan editor JSON](access_policies_create-console.md#access_policies_create-json-editor).

**Topics**
+ [Menggunakan peran untuk mendelegasikan akses ke sumber daya sumber daya lain Akun AWS](#example-delegate-xaccount-rolesapi)
+ [Menggunakan kebijakan untuk mendelegasikan akses ke layanan](#id_roles_create_policy-examples-access-to-services)
+ [Menggunakan kebijakan berbasis sumber daya untuk mendelegasikan akses ke bucket Amazon S3 di akun lain](#example-delegate-xaccount-S3)
+ [Menggunakan kebijakan berbasis sumber daya untuk mendelegasikan akses ke antrean Amazon SQS di akun lainnya](#example-delegate-xaccount-SQS)
+ [Tidak dapat mendelegasikan akun ketika akun ditolak aksesnya](#example-delegate-xaccount-SQS-denied)

## Menggunakan peran untuk mendelegasikan akses ke sumber daya sumber daya lain Akun AWS
<a name="example-delegate-xaccount-rolesapi"></a>

 Untuk tutorial yang menunjukkan cara menggunakan peran IAM untuk memberikan pengguna dalam satu akun akses ke AWS sumber daya yang ada di akun lain, lihat[Tutorial IAM: Delegasikan akses di seluruh AWS akun menggunakan peran IAM](tutorial_cross-account-with-roles.md). 

**penting**  
Anda dapat menyertakan ARN untuk peran atau pengguna tertentu dalam elemen `Principal` kebijakan kepercayaan peran. Saat Anda menyimpan polis, AWS ubah ARN menjadi ID utama yang unik. Hal ini membantu memitigasi risiko seseorang meningkatkan hak istimewa mereka dengan menghapus dan membuat kembali peran atau pengguna. Anda biasanya tidak melihat ID ini di konsol, karena juga ada transformasi balik kembali ke ARN ketika kebijakan kepercayaan ditampilkan. Namun, jika Anda menghapus peran atau pengguna, maka hubungan Anda akan rusak. Kebijakan tidak lagi berlaku, bahkan jika Anda membuat ulang pengguna atau peran karena itu tidak sesuai dengan ID prinsipal yang disimpan dalam kebijakan kepercayaan. Ketika ini terjadi, ID utama muncul di konsol karena tidak AWS dapat lagi memetakannya kembali ke ARN. Oleh karena itu, jika Anda menghapus dan membuat ulang pengguna atau peran yang dirujuk di dalam elemen `Principal` kebijakan kepercayaan, Anda harus mengubah peran untuk mengganti ARN. Itu diubah menjadi ID prinsipal baru saat Anda menyimpan kebijakan.

## Menggunakan kebijakan untuk mendelegasikan akses ke layanan
<a name="id_roles_create_policy-examples-access-to-services"></a>

Contoh berikut ini menunjukkan kebijakan yang dapat dilampirkan pada sebuah peran. Kebijakan ini memungkinkan dua layanan, Amazon EMR dan AWS Data Pipeline, untuk mengambil peran. Layanan kemudian dapat melakukan tugas yang diberikan oleh kebijakan izin yang ditetapkan untuk peran tersebut (tidak ditampilkan). Untuk menetapkan beberapa prinsipal layanan, Anda tidak menentukan dua elemen `Service`; Anda hanya dapat memiliki satu. Sebagai gantinya, Anda menggunakan serangkaian dari beberapa prinsipal layanan sebagai nilai elemen `Service` tunggal.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "elasticmapreduce.amazonaws.com",
          "datapipeline.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

## Menggunakan kebijakan berbasis sumber daya untuk mendelegasikan akses ke bucket Amazon S3 di akun lain
<a name="example-delegate-xaccount-S3"></a>

Dalam contoh ini, akun A menggunakan kebijakan berbasis sumber daya ([kebijakan bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucketPolicies.html) Amazon S3) untuk memberikan akun B akses penuh ke bucket S3 akun A. Lalu akun B membuat kebijakan pengguna IAM untuk mendelegasikan akses ke bucket akun A kepada salah satu pengguna di akun B. 

Kebijakan S3 bucket di akun A mungkin terlihat seperti kebijakan berikut. Dalam contoh ini, bucket S3 akun A diberi nama *amzn-s3-demo-bucket*, dan nomor akun B adalah 111122223333. Itu tidak menentukan pengguna individual atau pengguna kelompok di akun B, hanya akun itu sendiri.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Sid": "AccountBAccess1",
    "Effect": "Allow",
    "Principal": {"AWS": "111122223333"},
    "Action": "s3:*",
    "Resource": [
      "arn:aws:s3:::amzn-s3-demo-bucket",
      "arn:aws:s3:::amzn-s3-demo-bucket/*"
    ]
  }
}
```

------

Atau, akun A dapat menggunakan Amazon S3 [Access Control Lists (ACLs)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3_ACLs_UsingACLs.html) untuk memberikan akses akun B ke bucket S3 atau satu objek di dalam bucket. Dalam hal ini, satu-satunya hal yang berubah adalah bagaimana akun A memberikan akses ke akun B. Akun B masih menggunakan kebijakan untuk mendelegasikan akses ke kelompok IAM di akun B, seperti yang dijelaskan di bagian berikutnya dari contoh ini. Untuk informasi selengkapnya tentang mengontrol akses pada bucket dan objek S3, buka [Kontrol Akses](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingAuthAccess.html) di *Panduan Pengguna Layanan Penyimpanan Sederhana Amazon*. 

Administrator akun B dapat membuat sampel kebijakan berikut. Kebijakan ini memungkinkan akses baca ke kelompok atau pengguna di akun B. Kebijakan sebelumnya memberikan akses ke akun B. Namun demikian, kelompok individu dan pengguna di akun B tidak dapat mengakses sumber daya sampai suatu kelompok atau pengguna memberikan izin secara jelas ke sumber daya tersebut. Izin dalam kebijakan ini hanya dapat menjadi subset dari izin yang ada di kebijakan lintas akun sebelumnya. Akun B tidak dapat memberikan lebih banyak izin untuk kelompok dan penggunanya daripada yang diberikan akun A ke akun B dalam kebijakan pertama. Dalam kebijakan ini, elemen `Action` secara jelas ditentukan untuk hanya mengizinkan tindakan `List`, dan elemen `Resource` kebijakan ini sesuai dengan `Resource` untuk kebijakan bucket yang diterapkan oleh akun A.

Untuk menerapkan kebijakan ini akun B menggunakan IAM untuk melampirkannya ke pengguna (atau kelompok) yang sesuai di akun B. 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "s3:List*",
    "Resource": [
      "arn:aws:s3:::amzn-s3-demo-bucket",
      "arn:aws:s3:::amzn-s3-demo-bucket/*"
    ]
  }
}
```

------

## Menggunakan kebijakan berbasis sumber daya untuk mendelegasikan akses ke antrean Amazon SQS di akun lainnya
<a name="example-delegate-xaccount-SQS"></a>

Dalam contoh berikut, akun A memiliki antrean Amazon SQS yang menggunakan kebijakan berbasis sumber daya yang dilampirkan ke antrean untuk memberikan akses antrean ke akun B. Kemudian akun B menggunakan kebijakan kelompok IAM untuk mendelegasikan akses ke kelompok di akun B. 

Contoh kebijakan antrean berikut memberi akun B izin untuk melakukan tindakan `SendMessage` dan `ReceiveMessage` pada antrean akun A yang disebut *antrean1*, tetapi hanya antara tengah hari hingga pukul 15.00 pada 30 November 2014. Nomor akun Akun B adalah 1111-2222-3333. Akun A menggunakan Amazon SQS untuk menerapkan kebijakan ini. 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Principal": {"AWS": "111122223333"},
    "Action": [
      "sqs:SendMessage",
      "sqs:ReceiveMessage"
    ],
    "Resource": ["arn:aws:sqs:*:123456789012:queue1"],
    "Condition": {
      "DateGreaterThan": {"aws:CurrentTime": "2014-11-30T12:00Z"},
      "DateLessThan": {"aws:CurrentTime": "2014-11-30T15:00Z"}
    }
  }
}
```

------

Kebijakan akun B untuk mendelegasikan akses ke suatu kelompok di akun B dapat terlihat seperti contoh berikut. Akun B menggunakan IAM untuk melampirkan kebijakan ini ke kelompok (atau pengguna). 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "sqs:*",
    "Resource": "arn:aws:sqs:*:123456789012:queue1"
  }
}
```

------

Dalam contoh kebijakan pengguna IAM sebelumnya, akun B menggunakan wildcard untuk memberikan akses ke penggunanya ke semua tindakan Amazon SQS pada antrean akun A. Namun, akun B hanya dapat mendelegasikan akses jika akun B telah diberi akses. Kelompok akun B yang memiliki kebijakan kedua dapat mengakses antrean hanya antara tengah hari hingga pukul 15.00 pada 30 November 2014. Pengguna hanya dapat melakukan tindakan `SendMessage` dan `ReceiveMessage`, sebagaimana ditentukan dalam kebijakan antrean Amazon SQS akun A. 

## Tidak dapat mendelegasikan akun ketika akun ditolak aksesnya
<a name="example-delegate-xaccount-SQS-denied"></a>

 Akun AWS Tidak dapat mendelegasikan akses ke sumber daya akun lain jika akun lain secara eksplisit menolak akses ke akun induk pengguna. Penolakan ini meluas ke para pengguna dalam akun tersebut, baik apakah pengguna sudah memiliki kebijakan yang memberikan akses kepada mereka atau belum.

Sebagai contoh, akun A menyusun kebijakan bucket pada bucket S3 akun A yang secara eksplisit menolak akses akun B ke bucket akun A. Namun, akun B menyusun kebijakan pengguna IAM yang memberi pengguna akun B akses ke bucket akun A. Penolakan secara eksplisit yang diterapkan kepada bucket S3 akun A meluas ke para pengguna di akun B. Itu membatalkan kebijakan pengguna IAM yang memberikan akses ke pengguna di akun B. (Untuk informasi selengkapnya tentang bagaimana izin dievaluasi, lihat [Logika evaluasi kebijakan](reference_policies_evaluation-logic.md).) 

Kebijakan bucket Akun A dapat terlihat seperti kebijakan berikut ini. Dalam contoh ini, bucket S3 akun A diberi nama *amzn-s3-demo-bucket*, dan nomor akun B adalah 1111-2222-3333. Akun A menggunakan Amazon S3 untuk menerapkan kebijakan ini. 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Sid": "AccountBDeny",
    "Effect": "Deny",
    "Principal": {"AWS": "111122223333"},
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
  }
}
```

------

Penolakan secara eksplisit ini membatalkan kebijakan apa pun dalam akun B yang memberikan izin untuk mengakses bucket S3 dalam akun A. 

# Manajemen peran IAM
<a name="id_roles_manage"></a>

Sebelum pengguna, aplikasi, atau layanan dapat menggunakan peran yang Anda buat, Anda harus memberikan izin untuk beralih ke peran tersebut. Anda dapat menggunakan kebijakan apa pun yang dilampirkan ke grup atau pengguna untuk memberikan izin yang diperlukan. Bagian ini menjelaskan cara memberikan izin kepada pengguna untuk menggunakan peran. Ini juga menjelaskan bagaimana pengguna dapat beralih ke peran dari Konsol Manajemen AWS, Alat untuk Windows PowerShell, AWS Command Line Interface (AWS CLI) dan [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)API.

**penting**  
Saat Anda membuat program peran secara terprogram, alih-alih di konsol IAM, Anda memiliki opsi untuk menambahkan `Path` hingga 512 karakter selain `RoleName`, yang panjangnya dapat mencapai 64 karakter. Namun, jika Anda bermaksud menggunakan peran dengan fitur **Switch Role** di Konsol Manajemen AWS, maka gabungan `Path` dan `RoleName` tidak dapat melebihi 64 karakter.

**Topics**
+ [Lihat akses peran](#roles-modify_prerequisites)
+ [Menghasilkan kebijakan berdasarkan informasi akses](#roles-modify_gen-policy)
+ [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md)
+ [Berikan izin pengguna untuk meneruskan peran ke layanan AWS](id_roles_use_passrole.md)
+ [Mencabut kredensi keamanan sementara peran IAM](id_roles_use_revoke-sessions.md)
+ [Memperbarui peran terkait layanan](id_roles_update-service-linked-role.md)
+ [Memperbarui kebijakan kepercayaan peran](id_roles_update-role-trust-policy.md)
+ [Memperbarui izin untuk peran](id_roles_update-role-permissions.md)
+ [Perbarui setelan untuk peran](id_roles_update-role-settings.md)
+ [Hapus peran atau profil contoh](id_roles_manage_delete.md)

## Lihat akses peran
<a name="roles-modify_prerequisites"></a>

Sebelum mengubah izin pengguna, Anda harus meninjau aktivitas tingkat-layanan terakhirnya. Ini penting karena Anda tidak ingin menghapus akses dari suatu prinsipal (orang atau aplikasi) yang menggunakannya. Untuk informasi selengkapnya tentang melihat informasi yang terakhir diakses, lihat [Memperbaiki izin dalam AWS menggunakan informasi yang terakhir diakses](access_policies_last-accessed.md).

## Menghasilkan kebijakan berdasarkan informasi akses
<a name="roles-modify_gen-policy"></a>

Terkadang Anda dapat memberikan izin ke entitas IAM (pengguna atau peran) di luar yang mereka butuhkan. Untuk membantu Anda menyaring izin yang Anda berikan, Anda dapat membuat kebijakan IAM yang didasarkan pada aktivitas akses untuk entitas. IAM Access Analyzer meninjau AWS CloudTrail log Anda dan menghasilkan templat kebijakan yang berisi izin yang telah digunakan oleh entitas dalam rentang tanggal yang ditentukan. Anda dapat menggunakan templat untuk membuat kebijakan terkelola dengan izin berbutir halus, lalu melampirkannya ke entitas IAM. Dengan begitu, Anda hanya memberikan izin yang dibutuhkan pengguna atau peran untuk berinteraksi dengan AWS sumber daya untuk kasus penggunaan spesifik Anda. Untuk mempelajari selengkapnya, lihat Pembuatan [kebijakan IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-generation.html).

# Berikan izin pengguna untuk beralih peran
<a name="id_roles_use_permissions-to-switch"></a>

Ketika administrator [membuat peran untuk akses lintas akun](id_roles_create_for-user.md), mereka membangun kepercayaan antara akun yang memiliki peran, sumber daya (akun kepercayaan), dan akun yang berisi pengguna (akun tepercaya). Untuk melakukannya, administrator akun terpercaya menentukan nomor akun terpercaya sebagai `Principal` dalam kebijakan kepercayaan peran tersebut. Itu *berpotensi* memungkinkan pengguna mana pun di akun tepercaya untuk mengambil peran tersebut. Untuk menyelesaikan konfigurasi, administrator akun terpercaya harus memberikan izin kepada kelompok atau pengguna tertentu dalam izin akun tersebut untuk beralih ke peran.

**Untuk memberikan izin untuk beralih ke peran**

1. Sebagai administrator akun tepercaya, buat kebijakan baru untuk pengguna, atau edit kebijakan yang ada untuk menambahkan elemen yang diperlukan. Lihat perinciannya di [Membuat atau mengubah](#roles-usingrole-createpolicy).

1. Kemudian, pilih cara Anda ingin membagikan informasi peran: 
   + **Tautan peran:** Kirim pengguna tautan yang membawa mereka ke halaman **Beralih Peran** dengan semua detail yang sudah diisi. 
   + **ID Akun atau alias:** Berikan setiap pengguna nama peran bersama dengan nomor ID akun atau alias akun. Pengguna kemudian masuk ke halaman **Ganti Peran** dan menambahkan detail secara manual. 

   Lihat perinciannya di [Memberikan informasi kepada pengguna](#roles-usingrole-giveuser).

Perhatikan bahwa Anda dapat beralih peran hanya jika Anda masuk sebagai pengguna IAM, peran federasi SAML, atau peran federasi identitas web. Anda tidak dapat beralih peran saat masuk sebagai Pengguna root akun AWS.

**penting**  
Anda tidak dapat beralih peran Konsol Manajemen AWS ke peran yang membutuhkan [ExternalId](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id)nilai. Anda hanya dapat beralih ke peran tersebut dengan memanggil [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API yang mendukung parameter `ExternalId`.

**Catatan**  
Topik ini membahas kebijakan untuk *pengguna*, karena pada akhirnya Anda memberikan izin kepada pengguna untuk menyelesaikan tugas. Namun, kami tidak menyarankan Anda memberikan izin langsung ke pengguna individu. Saat pengguna mengambil peran, mereka diberi izin yang terkait dengan peran tersebut.
Saat Anda beralih peran Konsol Manajemen AWS, konsol selalu menggunakan kredenal asli Anda untuk mengotorisasi sakelar. Hal ini berlaku baik Anda masuk sebagai pengguna IAM, sebagai peran federasi SAML, atau sebagai peran federasi identitas-web. Misalnya, jika Anda beralih ke RoleA, IAM menggunakan pengguna asli atau kredensi peran federasi untuk menentukan apakah Anda diizinkan untuk mengambil RoleA. Jika Anda kemudian mencoba untuk beralih ke RoleB *saat menggunakan RoleA*, pengguna **asli** atau kredensial peran federasi digunakan untuk mengotorisasi upaya Anda. Kredensial untuk RoleA tidak digunakan untuk tindakan ini.

**Topics**
+ [Membuat atau mengubah](#roles-usingrole-createpolicy)
+ [Memberikan informasi kepada pengguna](#roles-usingrole-giveuser)

## Membuat atau mengubah
<a name="roles-usingrole-createpolicy"></a>

Kebijakan yang memberikan izin kepada pengguna untuk mengasumsikan peran harus mencantumkan pernyataan dengan efek `Allow` pada hal berikut: 
+ Tindakan `sts:AssumeRole`
+ Amazon Resource Name (ARN) peran dalam elemen `Resource`

Pengguna yang mendapatkan kebijakan diizinkan untuk beralih peran pada sumber daya yang terdaftar (baik melalui keanggotaan grup atau langsung dilampirkan).

**catatan**  
Jika `Resource` diatur menjadi `*`, pengguna dapat mengasumsikan peran apa pun dalam akun apa pun yang memercayai akun pengguna. (Dengan kata lain, kebijakan kepercayaan peran menentukan akun pengguna sebagai `Principal`). Sebaiknya, kami menyarankan agar Anda mengikuti [prinsip hak istimewa terendah](http://en.wikipedia.org/wiki/Principle_of_least_privilege) dan menentukan ARN lengkap hanya untuk peran yang dibutuhkan pengguna.

Contoh berikut menunjukkan kebijakan yang memungkinkan pengguna untuk mengasumsikan peran hanya dalam satu akun. Selain itu, kebijakan ini menggunakan wildcard (\$1) untuk menentukan bahwa pengguna dapat beralih ke peran hanya jika nama peran dimulai dan huruf `Test`.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::111122223333:role/Test*"
    }
}
```

------

**catatan**  
Izin yang diberikan oleh peran kepada pengguna tidak menambah izin yang sudah diberikan kepada pengguna. Saat pengguna beralih ke suatu peran, pengguna sementara waktu akan memberikan izin awalnya sebagai ganti atas apa yang diberikan oleh peran tersebut. Saat pengguna keluar dari peran, izin pengguna asli mereka dipulihkan secara otomatis. Misalnya, katakanlah izin pengguna memungkinkan bekerja dengan instans Amazon EC2, tetapi kebijakan izin peran tidak memberikan izin tersebut. Dalam hal ini, saat menggunakan peran tersebut, pengguna tidak dapat bekerja dengan instans Amazon EC2 di dalam konsol. Selain itu, kredensial sementara yang diperoleh melalui `AssumeRole` tidak bekerja dengan instans Amazon EC2 secara terprogram.

## Memberikan informasi kepada pengguna
<a name="roles-usingrole-giveuser"></a>

Setelah Anda membuat peran dan memberikan izin kepada pengguna Anda untuk beralih ke sana, Anda harus memberikan hal-hal berikut kepada pengguna:
+ Nama peran
+ ID atau alias akun yang berisi peran tersebut

Anda dapat merampingkan akses untuk pengguna Anda dengan mengirimkan tautan yang telah dikonfigurasi sebelumnya dengan ID akun dan nama peran. Anda dapat melihat tautan peran setelah menyelesaikan wizard **Buat Peran** dengan memilih spanduk **Lihat Peran**, atau pada halaman **Ringkasan Peran untuk peran** yang diaktifkan lintas akun.

Anda juga dapat menggunakan format berikut untuk menyusun tautan secara manual. Ganti ID akun atau alias Anda dan nama peran untuk dua parameter dalam contoh berikut.

`https://signin.aws.amazon.com/switchrole?account=your_account_ID_or_alias&roleName=optional_path/role_name`

Kami menyarankan Anda mengarahkan pengguna Anda [Beralih dari pengguna ke peran IAM (konsol)](id_roles_use_switch-role-console.md) untuk memandu mereka melalui proses tersebut. Untuk memecahkan masalah umum yang mungkin Anda temui saat mengasumsikan peran, lihat [Saya tidak dapat mengsumsikan peran](troubleshoot_roles.md#troubleshoot_roles_cant-assume-role).

**Pertimbangan-pertimbangan**
+ Jika Anda membuat peran secara terprogram, Anda dapat membuat peran dengan jalur dan nama. Jika demikian, Anda harus memberikan jalur lengkap dan nama peran kepada pengguna agar mereka dapat masuk ke halaman **Beralih Peran** di Konsol Manajemen AWS. Sebagai contoh: `division_abc/subdivision_efg/role_XYZ`.
+ Jika Anda membuat peran secara terprogram, Anda dapat menambahkan hingga 512 karakter dan a`Path`. `RoleName` Panjang nama peran dapat mencapai 64 karakter. Namun, untuk menggunakan peran dengan fitur **Switch Role** di Konsol Manajemen AWS, gabungan `Path` dan `RoleName` tidak dapat melebihi 64 karakter.
+ Untuk tujuan keamanan, Anda dapat [meninjau AWS CloudTrail log](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds) untuk mengetahui siapa yang melakukan tindakan AWS. Anda dapat menggunakan kunci syarat `sts:SourceIdentity` dalam peran kebijakan kepercayaan untuk mengharuskan pengguna menentukan identias saat mereka mengasumsikan sebuah peran. Misalnya, Anda dapat meminta agar pengguna IAM menentukan nama pengguna mereka sendiri sebagai identitas sumber mereka. Ini dapat membantu Anda menentukan pengguna mana yang melakukan tindakan tertentu di AWS. Untuk informasi selengkapnya, lihat [`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity). Anda juga dapat menggunakan [`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname) untuk mengharuskan pengguna menentukan nama sesi saat mereka mengambil peran. Hal ini dapat membantu Anda membedakan antara sesi peran ketika peran digunakan oleh prinsipal yang berbeda.

# Berikan izin pengguna untuk meneruskan peran ke layanan AWS
<a name="id_roles_use_passrole"></a>

Untuk mengonfigurasi banyak AWS layanan, Anda harus *meneruskan* peran IAM ke layanan. Ini memungkinkan layanan untuk mengambil peran nanti dan melakukan tindakan atas nama Anda. Untuk sebagian besar layanan, Anda hanya perlu meneruskan peran ke layanan satu kali selama penyiapan, dan tidak setiap kali layanan mengambil peran tersebut. Misalnya, anggap Anda memiliki aplikasi yang berjalan di instans Amazon EC2 Aplikasi tersebut memerlukan kredensial sementara untuk autentikasi, dan izin untuk mengotorisasi aplikasi guna melakukan tindakan di AWS. Saat menyiapkan aplikasi, Anda harus meneruskan peran ke Amazon EC2 untuk digunakan dengan instance yang menyediakan kredensi tersebut. Anda menentukan izin untuk aplikasi yang berjalan pada instans dengan melampirkan kebijakan IAM pada peran tersebut. Aplikasi ini mengasumsikan peran setiap kali diperlukan untuk melakukan tindakan yang diizinkan oleh peran tersebut.

Untuk meneruskan peran (dan izinnya) ke AWS layanan, pengguna harus memiliki izin untuk *meneruskan peran tersebut* ke layanan. Ini membantu administrator untuk memastikan bahwa hanya pengguna yang disetujui yang dapat mengonfigurasi layanan dengan peran yang memberikan izin. Untuk mengizinkan pengguna meneruskan peran ke AWS layanan, Anda harus memberikan `PassRole` izin kepada pengguna, peran, atau grup IAM pengguna.

**Awas**  
Anda hanya dapat menggunakan `PassRole` izin untuk meneruskan peran IAM ke layanan yang berbagi AWS akun yang sama. Untuk meneruskan peran di Akun A ke layanan di Akun B, Anda harus terlebih dahulu membuat peran IAM di Akun B yang dapat mengambil peran dari Akun A, dan kemudian peran dalam Akun B dapat diteruskan ke layanan. Lihat perinciannya di [Akses sumber daya lintas akun di IAM](access_policies-cross-account-resource-access.md).
Jangan mencoba mengontrol siapa yang dapat melewati peran dengan menandai peran dan kemudian menggunakan kunci `ResourceTag` kondisi dalam kebijakan dengan `iam:PassRole` tindakan tersebut. Pendekatan ini tidak memiliki hasil yang dapat diandalkan.

Saat menyetel `PassRole` izin, Anda harus memastikan bahwa pengguna tidak melewati peran di mana peran tersebut memiliki lebih banyak izin daripada yang Anda inginkan untuk dimiliki pengguna. Misalnya, Alice mungkin tidak diizinkan untuk melakukan tindakan Amazon S3 apa pun. Jika Alice dapat meneruskan peran ke layanan yang memungkinkan tindakan Amazon S3, layanan dapat melakukan tindakan Amazon S3 atas nama Alice saat menjalankan pekerjaan.

Saat menentukan peran terkait layanan, Anda juga harus memiliki izin untuk meneruskan peran tersebut ke layanan. Beberapa layanan secara otomatis membuat peran yang terkait dengan layanan di akun Anda ketika Anda melakukan tindakan di layanan tersebut. Misalnya, Amazon EC2 Auto Scaling `AWSServiceRoleForAutoScaling` membuat peran terkait layanan untuk Anda saat Anda membuat grup Auto Scaling untuk pertama kalinya. Jika Anda mencoba menentukan peran terkait layanan saat membuat grup Auto Scaling dan Anda tidak memiliki `iam:PassRole` izin, Anda akan menerima kesalahan. Jika Anda tidak menentukan peran secara eksplisit, `iam:PassRole` izin tidak diperlukan, dan defaultnya adalah menggunakan `AWSServiceRoleForAutoScaling` peran untuk semua operasi yang dilakukan pada grup tersebut. Untuk mempelajari layanan yang mendukung peran yang terkait dengan layanan, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md). Untuk mempelajari layanan mana yang secara otomatis membuat peran yang terkait dengan layanan saat Anda melakukan tindakan dalam layanan tersebut, pilih tautan **Ya** dan lihat dokumentasi peran yang terkait dengan layanan untuk layanan tersebut.

Pengguna dapat meneruskan sebuah peran ARN sebagai sebuah parameter dalam setiap operasi API yang menggunakan peran tersebut untuk menetapkan izin ke layanan. Layanan kemudian memeriksa apakah pengguna memiliki izin `iam:PassRole`. Untuk membatasi pengguna agar hanya meneruskan peran yang disetujui, Anda dapat menyaring izin `iam:PassRole` dengan elemen `Resources` pernyataan kebijakan IAM. 

Anda dapat menggunakan `Condition` elemen dalam kebijakan JSON untuk menguji nilai kunci yang disertakan dalam konteks permintaan semua AWS permintaan. Untuk mempelajari penggunaan kunci syarat dalam kebijakan, lihat [Elemen kebijakan IAM JSON: Condition](reference_policies_elements_condition.md). Kunci syarat `iam:PassedToService` dapat digunakan untuk menentukan ke prinsipal layanan mana sebuah peran dapat diberikan. Untuk mempelajari selengkapnya tentang menggunakan kunci `iam:PassedToService` kondisi dalam kebijakan, lihat [iam: PassedToService](reference_policies_iam-condition-keys.md#ck_PassedToService).

**Contoh 1**  
Misalkan Anda ingin memberi pengguna kemampuan untuk meneruskan serangkaian peran yang disetujui ke layanan Amazon EC2 setelah meluncurkan instance. Anda memerlukan tiga elemen:
+ *Kebijakan izin* IAM yang dilamprkan ke peran yang menentukan apa yang dapat dilakukan peran tersebut. Cakupan diperbolehkan hanya untuk tindakan yang harus dilakukan peran, dan hanya untuk sumber daya yang diperlukan peran untuk tindakan tersebut. Anda dapat menggunakan kebijakan izin IAM yang AWS dikelola atau dibuat pelanggan.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": {
          "Effect": "Allow",
          "Action": [ "A list of the permissions the role is allowed to use" ],
          "Resource": [ "A list of the resources the role is allowed to access" ]
      }
  }
  ```

------
+ *Kebijakan kepercayaan* untuk peran yang memungkinkan layanan untuk mengasumsikan peran. Misalnya, Anda dapat melampirkan kebijakan kepercayaan berikut pada peran dengan tindakan `UpdateAssumeRolePolicy`. Kebijakan kepercayaan ini memungkinkan Amazon EC2 untuk menggunakan peran dan izin yang dilampirkan pada peran tersebut.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": {
          "Sid": "TrustPolicyStatementThatAllowsEC2ServiceToAssumeTheAttachedRole",
          "Effect": "Allow",
          "Principal": { "Service": "ec2.amazonaws.com" },
         "Action": "sts:AssumeRole"
      }
  }
  ```

------
+ *Kebijakan izin* IAM yang dilampirkan pada pengguna IAM yang memungkinkan pengguna untuk hanya meneruskan peran yang disetujui tersebut. Anda biasanya `iam:GetRole` menambahkan `iam:PassRole` sehingga pengguna bisa mendapatkan detail peran yang akan diteruskan. Dalam contoh ini, pengguna hanya dapat meneruskan peran yang ada di akun yang ditentukan dengan nama yang diawali dengan`EC2-roles-for-XYZ-`:

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iam:GetRole",
                  "iam:PassRole"
              ],
              "Resource": "arn:aws:iam::111122223333:role/EC2-roles-for-XYZ-*"
          }
      ]
  }
  ```

------

Sekarang pengguna dapat memulai instans Amazon EC2 dengan peran yang ditetapkan. Aplikasi yang berjalan pada instans dapat mengakses kredensial sementara untuk peran tersebut melalui metadata profil instans. Kebijakan izin IAM yang dilamprkan ke peran yang menentukan apa yang dapat dilakukan oleh instans tersebut. 

**Contoh 2**  
Amazon Relational Database Service (Amazon RDS) mendukung fitur yang **disebut** Enhanced Monitoring. Fitur ini memungkinkan Amazon RDS untuk memantau instans basis data dengan menggunakan agen. Ini juga memungkinkan Amazon RDS untuk mencatat metrik ke Amazon CloudWatch Logs. Untuk mengaktifkan fitur ini, Anda harus membuat peran layanan untuk memberi Amazon RDS izin untuk memantau dan menyusun metrik ke log Anda. 

**Untuk membuat peran untuk pemantauan yang ditingkatkan Amazon RDS.**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Pilih **Peran**, lalu pilih **Buat peran**.

1. Pilih jenis peran **AWS Layanan**, dan kemudian untuk **kasus Penggunaan untuk lainnya Layanan AWS**, pilih layanan **RDS**. Pilih **RDS — Enhanced Monitoring**, lalu pilih **Next**.

1. Pilih kebijakan RDSEnhanced MonitoringRole izin **Amazon**.

1. Pilih **Berikutnya**.

1. Untuk **nama Peran**, masukkan nama peran yang membantu Anda mengidentifikasi tujuan peran ini. Nama peran harus unik di dalam diri Anda Akun AWS. Bila nama peran digunakan dalam kebijakan atau sebagai bagian dari ARN, nama peran tersebut peka huruf besar/kecil. Saat nama peran muncul ke pelanggan di konsol, seperti selama proses masuk, nama peran tidak peka huruf besar/kecil. Karena berbagai entitas mungkin mereferensikan peran tersebut, Anda tidak dapat mengedit nama peran setelah peran tersebut dibuat.

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi untuk peran baru ini.

1. (Opsional) Tambahkan metadata ke pengguna dengan cara melampirkan tanda sebagai pasangan nilai kunci. Untuk informasi selengkapnya tentang menggunakan tanda di IAM, lihat [Tag untuk AWS Identity and Access Management sumber daya](id_tags.md).

1. Tinjau peran dan kemudian pilih **Buat peran**.

Peran tersebut secara otomatis mendapatkan kebijakan kepercayaan yang memberikan izin layanan `monitoring.rds.amazonaws.com` untuk memegang peran tersebut. Setelah itu, Amazon RDS dapat melakukan semua tindakan yang diizinkan oleh kebijakan `AmazonRDSEnhancedMonitoringRole`.

Pengguna yang ingin Anda akses Enhanced Monitoring memerlukan kebijakan yang menyertakan pernyataan yang memungkinkan pengguna untuk mencantumkan peran RDS dan pernyataan yang memungkinkan pengguna untuk meneruskan peran, seperti berikut ini. Gunakan nomor akun Anda dan ganti nama peran dengan nama yang Anda berikan di langkah 6.

```
    {
      "Sid": "PolicyStatementToAllowUserToListRoles",
      "Effect": "Allow",
      "Action": ["iam:ListRoles"],
      "Resource": "*"
    },
    {
        "Sid": "PolicyStatementToAllowUserToPassOneSpecificRole",
        "Effect": "Allow",
        "Action": [ "iam:PassRole" ],
        "Resource": "arn:aws:iam::account-id:role/RDS-Monitoring-Role"
    }
```

Anda dapat menggabungkan pernyataan ini dengan pernyataan dalam kebijakan lain atau menempatkannya ke dalam kebijakannya sendiri. Sebagai gantinya, untuk menentukan bahwa pengguna dapat meneruskan peran apa pun yang dimulai`RDS-`, Anda dapat mengganti nama peran di ARN sumber daya dengan wildcard, sebagai berikut.

```
        "Resource": "arn:aws:iam::account-id:role/RDS-*"
```

## `iam:PassRole`tindakan dalam AWS CloudTrail log
<a name="id_roles_use_passrole_logs"></a>

 `PassRole`bukan panggilan API. `PassRole`adalah izin, artinya tidak ada CloudTrail log yang dihasilkan untuk IAM`PassRole`. Untuk meninjau peran apa yang diteruskan ke mana Layanan AWS CloudTrail, Anda harus meninjau CloudTrail log yang membuat atau memodifikasi AWS sumber daya yang menerima peran tersebut. Misalnya, peran diteruskan ke AWS Lambda fungsi saat dibuat. Log untuk `CreateFunction` tindakan menunjukkan catatan peran yang diteruskan ke fungsi. 

# Mencabut kredensi keamanan sementara peran IAM
<a name="id_roles_use_revoke-sessions"></a>

**Awas**  
Jika Anda mengikuti langkah-langkah di halaman ini, semua pengguna dengan sesi saat ini yang dibuat dengan asumsi peran ditolak akses ke semua AWS tindakan dan sumber daya. Hal ini dapat mengakibatkan pengguna kehilangan pekerjaan yang belum disimpan.

Ketika Anda mengizinkan pengguna untuk mengakses Konsol Manajemen AWS dengan waktu durasi sesi yang lama (seperti 12 jam), kredensi sementara mereka tidak kedaluwarsa dengan cepat. Jika pengguna secara tidak sengaja mengekspos kredensialnya kepada pihak ketiga yang tidak sah, pihak tersebut memiliki akses selama sesi berlangsung. Namun, Anda dapat segera mencabut semua izin untuk kredensial peran yang diterbitkan sebelum waktu tertentu jika perlu. Semua kredensial sementara untuk peran tersebut yang diterbitkan sebelum waktu yang ditentukan menjadi tidak berlaku. Ini memaksa semua pengguna untuk mengautentikasi ulang dan meminta kredensi baru.

 

**catatan**  
Anda tidak dapat mencabut sesi untuk *[peran yang terkait dengan layanan](id_roles.md#iam-term-service-linked-role)*.

Saat Anda mencabut izin untuk peran menggunakan prosedur dalam topik ini, AWS lampirkan kebijakan sebaris baru ke peran yang menolak semua izin untuk semua tindakan. Ini mencakup sebuah syarat yang menerapkan pembatasan hanya jika pengguna mengasumsikan peran tersebut *sebelum* waktu saat Anda mencabut izin. Jika pengguna mengasumsikan peran tersebut *setelah* Anda mencabut izin, maka kebijakan penolakan tidak berlaku bagi pengguna tersebut.

Untuk informasi lebih lanjut tentang menolak akses, lihat[Menonaktifkan izin untuk kredensial keamanan sementara](id_credentials_temp_control-access_disable-perms.md).

**penting**  
Kebijakan penolakan ini berlaku untuk semua pengguna peran yang ditentukan, bukan hanya untuk mereka yang memiliki sesi konsol durasi yang lebih lama.

## Izin minimum untuk mencabut izin sesi dari peran
<a name="revoke-session-permissions"></a>

Untuk dapat berhasil mencabut izin sesi dari peran, Anda harus memiliki izin `PutRolePolicy` untuk peran tersebut. Ini memungkinkan Anda untuk melampirkan kebijakan inline `AWSRevokeOlderSessions` ke peran tersebut.

## Mencabut izin sesi
<a name="revoke-session"></a>

Anda dapat mencabut izin sesi dari peran untuk menolak semua izin kepada pengguna mana pun yang mengambil peran tersebut.

**catatan**  
Anda tidak dapat mengedit peran di IAM yang dibuat dari kumpulan izin Pusat Identitas IAM. Anda harus mencabut sesi set izin aktif untuk pengguna di Pusat Identitas IAM. Untuk informasi selengkapnya, lihat [Mencabut sesi peran IAM aktif yang dibuat oleh set izin](https://docs.aws.amazon.com/singlesignon/latest/userguide/useraccess.html#revoke-user-permissions) di Panduan Pengguna Pusat *Identitas IAM*.

**Untuk segera menolak semua izin untuk pengguna kredensial peran saat ini**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi, pilih **Peran**, lalu pilih nama (bukan kotak centang) peran yang izinnya ingin dicabut.

1. Di halaman **Ringkasan** untuk peran yang dipilih, pilih tab **Cabut sesi**.

1. Di tab **Cabut sesi**, pilih **Cabut sesi aktif**.

1. AWS meminta Anda untuk mengkonfirmasi tindakan. Pilih **Saya mengakui bahwa saya mencabut semua sesi aktif untuk** peran ini. kotak centang dan pilih **Cabut sesi aktif** pada kotak dialog.

   IAM kemudian melampirkan kebijakan yang dinamai `AWSRevokeOlderSessions` untuk peran tersebut. Setelah Anda memilih **Cabut sesi aktif**, kebijakan menolak semua akses ke pengguna yang mengambil peran di masa lalu serta sekitar 30 detik ke depan. Pilihan future time ini memperhitungkan penundaan propagasi kebijakan untuk menangani sesi baru yang diperoleh atau diperbarui sebelum kebijakan yang diperbarui berlaku di wilayah tertentu. Setiap pengguna yang mengambil peran lebih dari sekitar 30 detik setelah Anda memilih Mencabut sesi aktif tidak terpengaruh. Untuk mempelajari mengapa perubahan tidak selalu langsung terlihat, lihat [Perubahan yang saya buat tidak selalu langsung terlihat](troubleshoot.md#troubleshoot_general_eventual-consistency). 

**catatan**  
Jika Anda memilih untuk **Mencabut sesi aktif** lagi nanti, stempel tanggal dan waktu dalam kebijakan akan di-refresh dan sekali lagi menolak semua izin untuk setiap pengguna yang mengambil peran sebelum waktu yang ditentukan.

Pengguna valid yang sesinya dicabut dengan cara ini harus memperoleh kredensial sementara untuk sesi baru untuk melanjutkan bekerja. AWS CLI Cache kredensialnya sampai kedaluwarsa. Untuk memaksa CLI menghapus dan menyegarkan kredensial yang tersimpan yang sudah tidak valid, jalankan salah satu perintah berikut:

**Linux, macOS, atau Unix**

```
$ rm -r ~/.aws/cli/cache
```

**Windows**

```
C:\> del /s /q %UserProfile%\.aws\cli\cache
```

## Mencabut izin sesi sebelum waktu yang ditentukan
<a name="revoke-session-policy"></a>

 Anda juga dapat mencabut izin sesi kapan saja sesuai pilihan Anda menggunakan AWS CLI atau SDK untuk menentukan nilai `aws:TokenIssueTime` kunci dalam elemen Kondisi kebijakan. 

Kebijakan ini menolak semua izin jika nilainya lebih awal dari `aws:TokenIssueTime` tanggal dan waktu yang ditentukan. Nilai dari `aws:TokenIssueTime` sesuai dengan waktu yang tepat saat kredensial keamanan sementara dibuat. `aws:TokenIssueTime`Nilai hanya ada dalam konteks AWS permintaan yang ditandatangani dengan kredenal keamanan sementara, sehingga pernyataan Deny dalam kebijakan tidak memengaruhi permintaan yang ditandatangani dengan kredensi jangka panjang pengguna IAM.

Kebijakan ini juga dapat dilampirkan pada suatu peran. Dalam hal ini, kebijakan hanya memengaruhi kredensial keamanan sementara yang dibuat oleh peran sebelum tanggal dan waktu yang ditentukan.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
      "DateLessThan": {"aws:TokenIssueTime": "2014-05-07T23:47:00Z"}
    }
  }
}
```

------

Pengguna valid yang sesinya dicabut dengan cara ini harus memperoleh kredensial sementara untuk sesi baru untuk melanjutkan bekerja. AWS CLI Cache kredensialnya sampai kedaluwarsa. Untuk memaksa CLI menghapus dan menyegarkan kredensial yang tersimpan yang sudah tidak valid, jalankan salah satu perintah berikut:

**Linux, macOS, atau Unix**

```
$ rm -r ~/.aws/cli/cache
```

**Windows**

```
C:\> del /s /q %UserProfile%\.aws\cli\cache
```

# Memperbarui peran terkait layanan
<a name="id_roles_update-service-linked-role"></a>

Metode yang Anda gunakan untuk mengedit peran yang ditautkan ke layanan bergantung pada layanan. Beberapa layanan mungkin mengizinkan Anda mengedit izin untuk peran tertaut-layanan dari konsol layanan, API, atau CLI. Namun, setelah Anda membuat peran terkait layanan, Anda tidak dapat mengubah nama peran karena berbagai entitas mungkin mereferensikan peran tersebut. Anda dapat mengedit deskripsi peran apa pun dari konsol IAM, API, atau CLI.

Untuk informasi tentang layanan mana yang mendukung peran yang terkait dengan layanan, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md) dan cari layanan yang memiliki **Ya **di kolom **Peran Terkait-Layanan** Untuk mempelajari apakah layanan mendukung pengeditan peran terkait layanan, pilih tautan **Yes** untuk melihat dokumentasi peran terkait layanan untuk layanan itu.

## Mengedit deskripsi peran yang ditautkan ke layanan (konsol)
<a name="edit-service-linked-role-iam-console"></a>

Anda dapat menggunakan konsol IAM untuk menyunting penjelasan peran terkait layanan.

**Untuk menyunting deskripsi peran terkait layanan (konsol IAM)**

1. Di panel navigasi konsol IAM, pilih **Peran**.

1. Pilih nama peran yang akan diubah.

1. Di ujung kanan **Deskripsi peran**, pilih **Edit**. 

1. Masukkan deskripsi baru di kotak, lalu pilih **Simpan**.

## Menyunting deskripsi peran terkait layanan (AWS CLI)
<a name="edit-service-linked-role-iam-cli"></a>

Anda dapat menggunakan perintah IAM dari AWS CLI untuk mengedit deskripsi peran terkait layanan.

**Untuk mengubah deskripsi peran terkait layanan (AWS CLI)**

1. (Opsional) Untuk melihat deskripsi peran saat ini, jalankan perintah berikut:

   ```
   aws iam [get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html) --role-name ROLE-NAME
   ```

   Gunakan nama peran, bukan ARN, untuk mereferensikan ke peran dengan perintah CLI. Misalnya, jika peran memiliki ARN berikut: `arn:aws:iam::123456789012:role/myrole`, referensi Anda ke peran sebagai **myrole**.

1. Untuk memperbarui deskripsi peran terkait layanan, jalankan perintah berikut:

   ```
   aws iam [update-role](https://docs.aws.amazon.com/cli/latest/reference/iam/update-role.html) --role-name ROLE-NAME --description OPTIONAL-DESCRIPTION
   ```

## Mengedit deskripsi peran terkait layanan (API)AWS
<a name="edit-service-linked-role-iam-api"></a>

Anda dapat menggunakan AWS API untuk mengedit deskripsi peran terkait layanan.

**Untuk mengubah deskripsi peran terkait layanan (API)AWS**

1. (Opsional) Untuk melihat deskripsi peran saat ini, panggil operasi berikut, dan sebutkan nama peran:

   AWS API: [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html) 

1. Untuk memperbarui deskripsi peran, hubungi operasi berikut, dan sebutkan nama (dan deskripsi opsional) peran tersebut: 

   AWS API: [UpdateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateRole.html) 

# Memperbarui kebijakan kepercayaan peran
<a name="id_roles_update-role-trust-policy"></a>

Untuk mengubah siapa yang dapat mengasumsikan peran, Anda harus mengubah kebijakan kepercayaan peran tersebut. Anda tidak dapat mengubah kebijakan kepercayaan untuk *[peran yang terkait dengan layanan](id_roles.md#iam-term-service-linked-role)*.

**Catatan**  
Jika pengguna terdaftar sebagai prinsipal dalam kebijakan kepercayaan peran, tetapi tidak dapat mengasumsikan peran tersebut, periksa [batas izin](access_policies_boundaries.md) pengguna tersebut. Jika batas izin diatur untuk pengguna tersebut, maka itu seharusnya memungkinkan tindakan `sts:AssumeRole`.
Untuk memungkinkan pengguna untuk mengambil peran saat ini lagi dalam sesi peran, tentukan peran ARN atau Akun AWS ARN sebagai prinsipal dalam kebijakan kepercayaan peran. Layanan AWS yang menyediakan sumber daya komputasi seperti Amazon EC2, Amazon ECS, Amazon EKS, dan Lambda memberikan kredensi sementara dan secara otomatis memperbarui kredensional ini. Ini memastikan bahwa Anda selalu memiliki seperangkat kredensional yang valid. Untuk layanan ini, tidak perlu mengambil peran saat ini lagi untuk mendapatkan kredensi sementara. Namun, jika Anda berniat untuk meneruskan [tag sesi](id_session-tags.md) [atau kebijakan sesi](access_policies.md#policies_session), Anda perlu mengambil peran saat ini lagi.


## Memperbarui kebijakan kepercayaan peran (konsol)
<a name="id_roles_update-trust-policy-console"></a>

**Untuk mengubah kebijakan kepercayaan peran dalam Konsol Manajemen AWS**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi konsol IAM, pilih **Peran**.

1. Dalam daftar peran di akun Anda, pilih nama peran yang ingin Anda ubah.

1. Pilih tab **Trust relationship**, lalu pilih **Edit trust policy**.

1. Ubah kebijakan kepercayaan sebagaimana diperlukan. Untuk menambahkan prinsipal tambahan yang dapat mengasumsikan peran, tentukan dalam elemen `Principal`. Misalnya, cuplikan kebijakan berikut menunjukkan cara mereferensikan dua Akun AWS elemen: `Principal`

   ```
   "Principal": {
     "AWS": [
       "arn:aws:iam::111122223333:root",
       "arn:aws:iam::444455556666:root"
     ]
   },
   ```

   Jika Anda menetapkan prinsipal di akun lain, menambahkan akun ke kebijakan kepercayaan dari suatu peran hanya setengah dari membangun hubungan kepercayaan lintas akun. Secara default, tidak ada pengguna dalam akun terpercaya yang dapat mengasumsikan peran tersebut. Administrator untuk akun yang baru dipercaya harus memberikan izin kepada pengguna untuk mengasumsikan peran tersebut. Untuk melakukannya, administrator harus membuat atau mengubah kebijakan yang dilampirkan pada pengguna untuk memberikan akses kepada pengguna ke tindakan `sts:AssumeRole`. Untuk informasi selengkapnya, lihat prosedur berikut atau [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).

   Cuplikan kebijakan berikut menunjukkan cara mereferensikan dua AWS layanan dalam elemen: `Principal`

   ```
   "Principal": {
     "Service": [
       "opsworks.amazonaws.com",
       "ec2.amazonaws.com"
     ]
   },
   ```

1. Setelah selesai mengedit kebijakan kepercayaan Anda, pilih **Perbarui kebijakan** untuk menyimpan perubahan Anda.

   Untuk informasi selengkapnya tentang struktur dan sintaks, lihat [Kebijakan dan izin di AWS Identity and Access Management](access_policies.md) dan [Referensi elemen kebijakan IAM JSON](reference_policies_elements.md).

**Untuk mengizinkan pengguna dalam akun eksternal terpercaya untuk menggunakan peran (konsol)**

Untuk informasi dan detail selengkapnya tentang prosedur ini, lihat [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).

1. Masuk ke eksternal tepercaya Akun AWS. 

1. Tentukan apakah akan melampirkan izin ke pengguna atau ke kelompok. Di panel navigasi konsol IAM, pilih **Pengguna atau **grup Pengguna**** yang sesuai.

1. Pilih nama pengguna atau kelompok yang ingin Anda beri akses, dan kemudian pilih tab **Izin**.

1. Lakukan salah satu langkah berikut:
   + Untuk mengubah kebijakan yang dikelola pelanggan, pilih nama kebijakan tersebut, pilih **Ubah Kebijakan**, lalu pilih tab **JSON**. Anda tidak dapat mengedit kebijakan AWS terkelola. AWS kebijakan terkelola muncul dengan AWS ikon (![\[Orange cube icon indicating a policy is managed by AWS.\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/policy_icon.png)). Untuk informasi selengkapnya tentang perbedaan antara kebijakan yang dikelola AWS dan kebijakan yang dikelola oleh pelanggan, lihat [Kebijakan terkelola dan kebijakan inline](access_policies_managed-vs-inline.md).
   + Untuk mengubah kebijakan inline, pilih panah di samping nama kebijakan dan pilih **Ubah Kebijakan**.

1. Dalam editor kebijakan, tambahkan elemen `Statement` baru yang menentukan hal berikut:

   ```
   {
     "Effect": "Allow",
     "Action": "sts:AssumeRole",
     "Resource": "arn:aws:iam::ACCOUNT-ID:role/ROLE-NAME"
   }
   ```

   Ganti ARN dalam pernyataan dengan ARN dari peran yang dapat diasumsikan oleh pengguna.

1. Ikuti prompt pada layar untuk menyelesaikan pengubahan kebijakan. 

## Memperbarui kebijakan kepercayaan peran (AWS CLI)
<a name="id_roles-update-trust-policy-cli"></a>

Anda dapat menggunakan AWS CLI untuk mengubah siapa yang dapat mengambil peran.

**Untuk mengubah kebijakan kepercayaan peran (AWS CLI)**

1. (Opsional) Jika Anda tidak tahu nama peran yang ingin Anda ubah, jalankan perintah berikut untuk membuat daftar peran di akun Anda:
   + [aws iam daftar peran](https://docs.aws.amazon.com/cli/latest/reference/iam/list-roles.html)

1. (Opsional) Untuk melihat penjelasan peran terkini, gunakan perintah berikut:
   + [aws iam mendapatkan peran](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. Untuk mengubah prinsipal terpercaya yang dapat mengakses peran, buat file teks dengan kebijakan kepercayaan yang diperbarui. Anda dapat menggunakan editor teks apa pun untuk menyusun kebijakan.

   Misalnya, kebijakan kepercayaan berikut menunjukkan cara Akun AWS mereferensikan dua `Principal` elemen. Hal ini memungkinkan pengguna dalam dua terpisah Akun AWS untuk mengambil peran ini.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"AWS": [
               "arn:aws:iam::111122223333:root",
               "arn:aws:iam::444455556666:root"
           ]},
           "Action": "sts:AssumeRole"
       }
   }
   ```

------

   Jika Anda menetapkan prinsipal di akun lain, menambahkan akun ke kebijakan kepercayaan dari suatu peran hanya setengah dari membangun hubungan kepercayaan lintas akun. Secara default, tidak ada pengguna dalam akun terpercaya yang dapat mengasumsikan peran tersebut. Administrator untuk akun yang baru dipercaya harus memberikan izin kepada pengguna untuk mengasumsikan peran tersebut. Untuk melakukannya, administrator harus membuat atau mengubah kebijakan yang dilampirkan pada pengguna untuk memberikan akses kepada pengguna ke tindakan `sts:AssumeRole`. Untuk informasi selengkapnya, lihat prosedur berikut atau [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).

1. Untuk menggunakan file yang baru saja Anda buat untuk memperbarui kebijakan kepercayaan, jalankan perintah berikut:
   + [aws iam update-assume-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/update-assume-role-policy.html)

**Untuk mengizinkan pengguna dalam akun eksternal tepercaya untuk menggunakan peran (AWS CLI)**

Untuk informasi dan detail selengkapnya tentang prosedur ini, lihat [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).

1. Buat file JSON yang berisi kebijakan izin yang memberikan izin untuk mengasumsikan peran tersebut. Misalnya, kebijakan berikut memuat izin minimum yang diperlukan:

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRole",
           "Resource": "arn:aws:iam::111122223333:role/ROLE-NAME"
       }
   }
   ```

------

   Ganti ARN dalam pernyataan dengan ARN dari peran yang dapat diasumsikan oleh pengguna.

1. Jalankan perintah berikut untuk mengunggah file JSON yang berisi kebijakan kepercayaan ke IAM:
   + [aws iam membuat kebijakan](https://docs.aws.amazon.com/cli/latest/reference/iam/create-policy.html)

   Keluaran dari perintah ini mencakup ARN kebijakan. Catat ARN ini karena Anda akan memerlukannya di langkah berikutnya. 

1. Tentukan pengguna atau kelompok mana yang akan dilampiri kebijakan ini. Jika Anda tidak tahu nama pengguna atau kelompok yang dimaksudkan, gunakan salah satu perintah berikut untuk membuat daftar pengguna atau kelompok di akun Anda:
   + [aws iam daftar-pengguna](https://docs.aws.amazon.com/cli/latest/reference/iam/list-users.html)
   + [aws iam daftar-grup](https://docs.aws.amazon.com/cli/latest/reference/iam/list-groups.html)

1. Gunakan salah satu perintah berikut untuk melampirkan kebijakan yang Anda buat pada langkah sebelumnya kepada pengguna atau kelompok:
   + [aws iam attach-user-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-user-policy.html)
   + [aws iam attach-group-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-group-policy.html)

## Memperbarui kebijakan kepercayaan peran (AWS API)
<a name="id_roles-update-trust-policy-api"></a>

Anda dapat menggunakan AWS API untuk mengubah siapa yang dapat mengambil peran.

**Untuk memodifikasi kebijakan kepercayaan peran (AWS API)**

1. (Opsional) Jika Anda tidak tahu nama peran yang ingin Anda ubah, jalankan perintah berikut untuk membuat daftar peran di akun Anda:
   + [ListRoles](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html)

1. (Opsional) Untuk melihat kebijakan kepercayaan terkini untuk peran, panggil operasi berikut:
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html)

1. Untuk mengubah prinsipal terpercaya yang dapat mengakses peran, buat file teks dengan kebijakan kepercayaan yang diperbarui. Anda dapat menggunakan editor teks apa pun untuk menyusun kebijakan.

   Misalnya, kebijakan kepercayaan berikut menunjukkan cara Akun AWS mereferensikan dua `Principal` elemen. Hal ini memungkinkan pengguna dalam dua terpisah Akun AWS untuk mengambil peran ini.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"AWS": [
               "arn:aws:iam::111122223333:root",
               "arn:aws:iam::444455556666:root"
           ]},
           "Action": "sts:AssumeRole"
       }
   }
   ```

------

   Jika Anda menetapkan prinsipal di akun lain, menambahkan akun ke kebijakan kepercayaan dari suatu peran hanya setengah dari membangun hubungan kepercayaan lintas akun. Secara default, tidak ada pengguna dalam akun terpercaya yang dapat mengasumsikan peran tersebut. Administrator untuk akun yang baru dipercaya harus memberikan izin kepada pengguna untuk mengasumsikan peran tersebut. Untuk melakukannya, administrator harus membuat atau mengubah kebijakan yang dilampirkan pada pengguna untuk memberikan akses kepada pengguna ke tindakan `sts:AssumeRole`. Untuk informasi selengkapnya, lihat prosedur berikut atau [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).

1. Untuk menggunakan file yang baru saja Anda buat untuk memperbarui kebijakan kepercayaan, panggil operasi berikut:
   + [UpdateAssumeRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAssumeRolePolicy.html)

**Untuk memungkinkan pengguna di akun eksternal tepercaya menggunakan peran (AWS API)**

Untuk informasi dan detail selengkapnya tentang prosedur ini, lihat [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).

1. Buat file JSON yang berisi kebijakan izin yang memberikan izin untuk mengasumsikan peran tersebut. Misalnya, kebijakan berikut memuat izin minimum yang diperlukan:

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRole",
           "Resource": "arn:aws:iam::111122223333:role/ROLE-NAME"
       }
   }
   ```

------

   Ganti ARN dalam pernyataan dengan ARN dari peran yang dapat diasumsikan oleh pengguna.

1. Panggil operasi berikut untuk mengunggah file JSON yang berisi kebijakan kepercayaan ke IAM:
   + [CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html)

   Keluaran operasi ini mencakup ARN kebijakan. Catat ARN ini karena Anda akan memerlukannya di langkah berikutnya. 

1. Tentukan pengguna atau kelompok mana yang akan dilampiri kebijakan ini. Jika Anda tidak tahu nama pengguna atau grup yang dimaksudkan, panggil salah satu operasi berikut untuk membuat daftar pengguna atau kelompok di akun Anda:
   + [ListUsers](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html)
   + [ListGroups](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroups.html)

1. Panggil salah satu perintah berikut untuk melampirkan kebijakan yang Anda buat pada langkah sebelumnya kepada pengguna atau kelompok:
   +  API: [AttachUserPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachUserPolicy.html)
   + [AttachGroupPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachGroupPolicy.html)

# Memperbarui izin untuk peran
<a name="id_roles_update-role-permissions"></a>

Gunakan prosedur berikut untuk memperbarui kebijakan izin peran dan batasan izin.

## Prasyarat: Lihat akses peran
<a name="roles-modify_prerequisites"></a>

Sebelum mengubah izin pengguna, Anda harus meninjau aktivitas tingkat-layanan terakhirnya. Ini penting karena Anda tidak ingin menghapus akses dari suatu prinsipal (orang atau aplikasi) yang menggunakannya. Untuk informasi selengkapnya perihal melihat informasi yang terakhir diakses, lihat [Memperbaiki izin dalam AWS menggunakan informasi yang terakhir diakses](access_policies_last-accessed.md).

## Memperbarui kebijakan izin untuk peran
<a name="id_roles_update-role-permissions-policy"></a>

Untuk mengubah izin yang diperbolehkan oleh peran tersebut, ubah kebijakan (atau beberapa kebijakan) izin peran tersebut. Anda tidak dapat mengubah kebijakan kepercayaan untuk *[peran yang terkait dengan layanan](id_roles.md#iam-term-service-linked-role)* dalam IAM. Anda mungkin dapat mengubah kebijakan izin dalam layanan yang bergantung pada peran tersebut. Untuk memeriksa apakah layanan mendukung fitur ini, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md) dan cari layanan yang memiliki **Ya **dalam kolom **Peran yang terkait dengan layanan**. Pilih **Ya** dengan tautan untuk melihat dokumentasi peran yang terkait dengan layanan untuk layanan tersebut.

### Memperbarui kebijakan izin peran (konsol)
<a name="id_roles_update-role-permissions-policy-console"></a>

**Untuk mengubah izin yang diperbolehkan oleh peran (konsol)**

1. Buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi konsol IAM, pilih **Peran**.

1. Pilih nama peran yang ingin Anda ubah, dan kemudian pilih tab**Izin**.

1. Lakukan salah satu langkah berikut:
   + Untuk mengubah kebijakan yang dikelola oleh pelanggan yang sudah ada, pilih nama kebijakan tersebut dan kemudian pilih **Ubah kebijakan**.
**catatan**  
Anda tidak dapat mengedit kebijakan AWS terkelola. AWS kebijakan terkelola muncul dengan AWS ikon (![\[Orange cube icon indicating a policy is managed by AWS.\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/policy_icon.png)). Untuk informasi selengkapnya tentang perbedaan antara kebijakan AWS terkelola dan kebijakan yang dikelola pelanggan, lihat[Kebijakan terkelola dan kebijakan inline](access_policies_managed-vs-inline.md). 
   + Untuk melampirkan kebijakan terkelola yang ada ke peran, pilih **Tambahkan izin**, lalu pilih **Lampirkan kebijakan**.
   + Untuk mengedit kebijakan inline yang ada, perluas kebijakan dan pilih **Edit**.
   + Untuk menyematkan kebijakan sebaris baru, pilih **Tambahkan izin**, lalu pilih **Buat** kebijakan sebaris. 
   + Untuk menghapus kebijakan yang ada dari peran, pilih kotak centang di samping nama kebijakan, lalu pilih **Hapus**.

### Memperbarui kebijakan izin peran ()AWS CLI
<a name="id_roles_update_permissions-policy-cli"></a>

Untuk mengubah izin yang diperbolehkan oleh peran tersebut, ubah kebijakan (atau beberapa kebijakan) izin peran tersebut. Anda tidak dapat mengubah kebijakan kepercayaan untuk *[peran yang terkait dengan layanan](id_roles.md#iam-term-service-linked-role)* dalam IAM. Anda mungkin dapat mengubah kebijakan izin dalam layanan yang bergantung pada peran tersebut. Untuk memeriksa apakah layanan mendukung fitur ini, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md) dan cari layanan yang memiliki **Ya **dalam kolom **Peran yang terkait dengan layanan**. Pilih **Ya** dengan tautan untuk melihat dokumentasi peran yang terkait dengan layanan untuk layanan tersebut.

**Untuk mengubah izin yang diperbolehkan oleh peran (AWS CLI)**

1. (Opsional) Untuk melihat izin yang saat ini terkait dengan peran, jalankan perintah berikut:

   1. [aws iam list-role-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-role-policies.html) untuk mencantumkan kebijakan sebaris

   1. [aws iam list-attached-role-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-attached-role-policies.html) untuk membuat daftar kebijakan terkelola

1. Perintah untuk memperbarui izin untuk peran berbeda-beda tergantung pada apakah Anda memperbarui kebijakan terkelola atau kebijakan inline.

   Untuk memperbarui kebijakan terkelola, panggil operasi berikut untuk membuat versi baru kebijakan terkelola:
   + [aws iam create-policy-version](https://docs.aws.amazon.com/cli/latest/reference/iam/create-policy-version.html)

   Untuk memperbarui kebijakan inline, jalankan perintah berikut:
   + [aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html)

### Memperbarui kebijakan izin peran (AWS API)
<a name="id_roles_update_permissions-policy-api"></a>

Untuk mengubah izin yang diperbolehkan oleh peran tersebut, ubah kebijakan (atau beberapa kebijakan) izin peran tersebut. Anda tidak dapat mengubah kebijakan kepercayaan untuk *[peran yang terkait dengan layanan](id_roles.md#iam-term-service-linked-role)* dalam IAM. Anda mungkin dapat mengubah kebijakan izin dalam layanan yang bergantung pada peran tersebut. Untuk memeriksa apakah layanan mendukung fitur ini, lihat [AWS layanan yang bekerja dengan IAM](reference_aws-services-that-work-with-iam.md) dan cari layanan yang memiliki **Ya **dalam kolom **Peran yang terkait dengan layanan**. Pilih **Ya** dengan tautan untuk melihat dokumentasi peran yang terkait dengan layanan untuk layanan tersebut.

**Untuk mengubah izin yang diizinkan oleh peran (AWS API)**

1. (Opsional) Untuk melihat izin yang saat ini terkait dengan peran, panggil perintah berikut:

   1. [ListRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html) untuk membuat daftar kebijakan inline

   1. [ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html) untuk membuat daftar kebijakan terkelola

1. Operasi untuk memperbarui izin untuk peran berbeda-beda tergantung pada apakah Anda memperbarui kebijakan terkelola atau kebijakan inline.

   Untuk memperbarui kebijakan terkelola, panggil operasi berikut untuk membuat versi baru kebijakan terkelola:
   + [CreatePolicyVersion](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicyVersion.html)

   Untuk memperbarui kebijakan inline, panggil operasi berikut:
   + [PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html)

## Perbarui batas izin untuk peran
<a name="id_roles_update-role-permissions-boundary"></a>

Untuk mengubah izin maksimum yang diperbolehkan untuk peran, ubah [batas izin](access_policies_boundaries.md) peran.

### Memperbarui batas izin peran (konsol)
<a name="id_roles_update-permissions-boundary-console"></a>

**Untuk mengubah kebijakan yang digunakan untuk mengatur batas izin untuk peran**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi, pilih **Peran**.

1. Pilih nama peran dengan [batas izin](access_policies_boundaries.md) yang ingin Anda ubah. 

1. Pilih tab **Izin**. Jika perlu, buka bagian **Batas izin** lalu pilih **Ubah batas**.

1. Pilih kebijakan yang ingin Anda gunakan untuk batasan izin.

1. Pilih **Ubah batas**.

   Perubahan Anda tidak berlaku sampai saat berikutnya seseorang mengasumsikan peran ini.

### Memperbarui batas izin peran ()AWS CLI
<a name="id_roles_update_permissions-boundary-cli"></a>

**Untuk mengubah kebijakan terkelola yang digunakan untuk mengatur batas izin peran (AWS CLI)**

1. (Opsional) Untuk melihat [batas izin](access_policies_boundaries.md) terkini untuk peran, jalankan perintah berikut: 
   + [aws iam mendapatkan peran](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. Untuk menggunakan kebijakan terkelola yang berbeda untuk memperbarui batas izin untuk peran, jalankan perintah berikut: 
   + [aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html)

   Peran hanya dapat memiliki satu kebijakan terkelola yang diatur sebagai batas izin. Jika Anda mengubah batas izin, Anda juga mengubah izin maksimum yang diperbolehkan untuk peran.

### Memperbarui batas izin peran (API)AWS
<a name="id_roles_update-permissions-boundary-api"></a>

**Untuk mengubah kebijakan terkelola yang digunakan untuk menyetel batas izin untuk peran (API)AWS**

1. (Opsional) Untuk melihat [batas izin](access_policies_boundaries.md) terkini untuk peran, panggil operasi berikut: 
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html)

1. Untuk menggunakan kebijakan terkelola untuk memperbarui batas izin untuk peran, panggil operasi berikut: 
   + [PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html)

   Peran hanya dapat memiliki satu kebijakan terkelola yang diatur sebagai batas izin. Jika Anda mengubah batas izin, Anda juga mengubah izin maksimum yang diperbolehkan untuk peran.

# Perbarui setelan untuk peran
<a name="id_roles_update-role-settings"></a>

Gunakan prosedur berikut untuk memperbarui deskripsi peran atau mengubah durasi sesi maksimum untuk peran.

## Memperbarui deskripsi peran
<a name="id_roles_update-description"></a>

Untuk mengubah deskripsi peran, ubah teks deskripsi.

### Memperbarui deskripsi peran (konsol)
<a name="id_roles_update-description-console"></a>

**Untuk mengubah deskripsi peran (konsol)**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi konsol IAM, pilih **Peran**.

1. Pilih nama peran yang akan diubah.

1. Di bagian **Ringkasan**, pilih **Edit**.

1. Memasukkan Deskripsi baru di kotak, dan memilih **Simpan perubahan**.

### Memperbarui deskripsi peran (AWS CLI)
<a name="id_roles_update-description-cli"></a>

**Untuk mengubah deskripsi peran (AWS CLI)**

1. (Opsional) Untuk melihat deskripsi peran terkini, jalankan perintah berikut:
   + [aws iam mendapatkan peran](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. Untuk memperbarui deskripsi peran, jalankan perintah berikut dengan parameter deskripsi:
   + [peran pembaruan aws iam](https://docs.aws.amazon.com/cli/latest/reference/iam/update-role.html)

### Memperbarui deskripsi peran (AWS API)
<a name="id_roles_update-description-api"></a>

**Untuk mengubah deskripsi peran (AWS API)**

1. (Opsional) Untuk melihat desripsi terkini untuk peran, panggil operasi berikut:
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html) 

1. Untuk memperbarui deskripsi peran, panggil operasi berikut dengan parameter deskripsi:
   + [UpdateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateRole.html)

## Memperbarui durasi sesi maksimum untuk peran
<a name="id_roles_update-session-duration"></a>

Untuk menentukan setelan durasi sesi maksimum untuk peran yang diasumsikan menggunakan konsol, API AWS CLI, atau AWS API, ubah nilai setelan durasi sesi maksimum. Pengaturan ini dapat memiliki nilai dari 1 jam hingga 12 jam. Jika Anda tidak menentukan nilai, defaultnya maksimum 1 jam diterapkan. Pengaturan ini tidak membatasi sesi yang diasumsikan oleh AWS layanan.

### Memperbarui durasi sesi peran maksimum (konsol)
<a name="id_roles_update-session-duration-console"></a><a name="id_roles_modify_max-session"></a>

**Untuk mengubah setelan durasi sesi maksimum untuk peran yang diasumsikan menggunakan konsol, AWS CLI, atau AWS API (konsol)**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi konsol IAM, pilih **Peran**.

1. Pilih nama peran yang akan diubah.

1. Di bagian **Ringkasan**, pilih **Edit**.

1. Untuk **Durasi sesi maksimum**, pilih nilai. Atau, pilih **Durasi kustom** dan masukkan nilai (dalam detik).

1. Pilih **Simpan perubahan**.

   Perubahan Anda tidak berlaku sampai saat berikutnya seseorang mengasumsikan peran ini. Untuk mempelajari cara mencabut sesi yang ada untuk peran ini, lihat [Mencabut kredensi keamanan sementara peran IAM](id_roles_use_revoke-sessions.md).

Dalam Konsol Manajemen AWS, sesi pengguna IAM adalah 12 jam secara default. Pengguna IAM yang beralih peran di konsol diberikan durasi sesi maksimum peran, atau sisa waktu dalam sesi pengguna, mana yang lebih sedikit.

Siapa pun yang mengambil peran dari AWS CLI atau AWS API dapat meminta sesi yang lebih lama, hingga maksimum ini. Pengaturan `MaxSessionDuration` menentukan durasi maksimum dari sesi peran yang dapat diminta.
+ Untuk menentukan durasi sesi menggunakan AWS CLI menggunakan `duration-seconds` parameter. Untuk mempelajari selengkapnya, lihat [Beralih ke peran IAM ()AWS CLI](id_roles_use_switch-role-cli.md).
+ Untuk menentukan durasi sesi menggunakan AWS API, gunakan `DurationSeconds` parameter. Untuk mempelajari selengkapnya, lihat [Beralih ke peran IAM (AWS API)](id_roles_use_switch-role-api.md). 

### Memperbarui durasi sesi peran maksimum (AWS CLI)
<a name="id_roles_update-session-duration-cli"></a>

**catatan**  
Siapa pun yang mengambil peran dari AWS CLI atau API dapat menggunakan parameter `duration-seconds` CLI atau parameter API untuk meminta sesi `DurationSeconds` yang lebih lama. Pengaturan `MaxSessionDuration` menentukan durasi maksimum dari sesi peran yang dapat diminta dengan menggunakan parameter `DurationSeconds`. Jika pengguna tidak menentukan nilai untuk parameter `DurationSeconds` tersebut, kredensial keamanan mereka berlaku selama satu jam.

**Untuk mengubah setelan durasi sesi maksimum untuk peran yang diasumsikan menggunakan AWS CLI (AWS CLI)**

1. (Opsional) Untuk melihat durasi sesi maksimum peran untuk peran, jalankan perintah berikut:
   + [aws iam mendapatkan peran](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. Untuk memperbarui pengaturan durasi sesi maksimum peran, jalankan perintah berikut dengan parameter `max-session-duration` CLI atau parameter API `MaxSessionDuration`:
   + [peran pembaruan aws iam](https://docs.aws.amazon.com/cli/latest/reference/iam/update-role.html)

   Perubahan Anda tidak berlaku sampai saat berikutnya seseorang mengasumsikan peran ini. Untuk mempelajari cara mencabut sesi yang ada untuk peran ini, lihat [Mencabut kredensi keamanan sementara peran IAM](id_roles_use_revoke-sessions.md).

### Memperbarui durasi sesi peran maksimum (AWS API)
<a name="id_roles_update-session-duration-api"></a>

**catatan**  
Siapa pun yang mengambil peran dari AWS CLI atau API dapat menggunakan parameter `duration-seconds` CLI atau parameter API untuk meminta sesi `DurationSeconds` yang lebih lama. Pengaturan `MaxSessionDuration` menentukan durasi maksimum dari sesi peran yang dapat diminta dengan menggunakan parameter `DurationSeconds`. Jika pengguna tidak menentukan nilai untuk parameter `DurationSeconds` tersebut, kredensial keamanan mereka berlaku selama satu jam.

**Untuk mengubah setelan durasi sesi maksimum untuk peran yang diasumsikan menggunakan API (AWS API)**

1. (Opsional) Untuk melihat durasi sesi maksimum terkini untuk peran, panggil operasi berikut:
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html) 

1. Untuk memperbarui pengaturan durasi sesi maksimum peran, panggil operasi berikut dengan `max-sessionduration` Parameter CLI atau `MaxSessionDuration` Parameter API:
   + [UpdateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateRole.html)

   Perubahan Anda tidak berlaku sampai saat berikutnya seseorang mengasumsikan peran ini. Untuk mempelajari cara mencabut sesi yang ada untuk peran ini, lihat [Mencabut kredensi keamanan sementara peran IAM](id_roles_use_revoke-sessions.md).

# Hapus peran atau profil contoh
<a name="id_roles_manage_delete"></a>

Jika Anda tidak lagi memerlukan peran, kami sarankan Anda untuk menghapus peran tersebut dan izin terkaitnya. Dengan begitu, Anda tidak memiliki entitas yang tidak digunakan yang tidak dipantau atau dipelihara secara aktif. 

Jika peran tersebut dikaitkan dengan instans EC2, Anda juga dapat menghapus peran tersebut dari profil instans dan kemudian menghapus profil instans.

**Awas**  
Pastikan Anda tidak memiliki instans Amazon EC2 yang sedang berjalan dengan peran atau profil instans yang akan Anda hapus. Menghapus peran atau profil instans yang terkait dengan suatu instans yang sedang berjalan akan merusak aplikasi yang sedang berjalan pada instans tersebut.

Jika Anda memilih untuk tidak menghapus peran secara permanen, Anda dapat menonaktifkan peran. Untuk melakukannya, ubah kebijakan peran lalu cabut semua sesi saat ini. Misalnya, Anda dapat menambahkan kebijakan ke peran yang menolak akses ke semua peran AWS. Anda juga dapat mengubah kebijakan kepercayaan untuk menolak akses ke siapa pun yang mencoba untuk mengasumsikan peran tersebut. Untuk informasi lebih lanjut tentang mencabut sesi, lihat [Mencabut kredensi keamanan sementara peran IAM](id_roles_use_revoke-sessions.md).

**Topics**
+ [Melihat akses peran](#roles-delete_prerequisites)
+ [Menghapus peran yang terkait dengan layanan](#id_roles_manage_delete_slr)
+ [Menghapus peran IAM (konsol)](#roles-managingrole-deleting-console)
+ [Menghapus peran IAM ()AWS CLI](#roles-managingrole-deleting-cli)
+ [Menghapus peran IAM (API)AWS](#roles-managingrole-deleting-api)
+ [Informasi Terkait](#roles-managingrole-deleting-related-info)

## Melihat akses peran
<a name="roles-delete_prerequisites"></a>

Sebelum menghapus peran, kami menyarankan agar Anda meninjau kapan peran tersebut terakhir kali digunakan. Anda dapat melakukan ini menggunakan Konsol Manajemen AWS, the AWS CLI, atau AWS API. Anda harus melihat informasi ini karena Anda tidak ingin menghapus akses dari seseorang yang menggunakan peran tersebut. 

Tanggal aktivitas terakhir peran mungkin tidak cocok dengan tanggal terakhir yang dilaporkan di tab **Terakhir Diakses**. Tab [**Terakhir Diakses**](access_policies_last-accessed-view-data.md) melaporkan aktivitas hanya untuk layanan yang diizinkan oleh kebijakan izin peran. Tanggal aktivitas terakhir peran mencakup upaya terakhir untuk mengakses layanan apa pun AWS.

**catatan**  
Periode pelacakan untuk aktivitas terakhir peran dan data Terakhir Diakses adalah selama 400 hari terakhir. Periode ini bisa lebih singkat jika Wilayah Anda mulai mendukung fitur-fitur ini tahun lalu. Peran ini mungkin telah digunakan lebih dari 400 hari yang lalu. Untuk informasi lebih lanjut tentang periode pelacakan ini, lihat [Tempat AWS melacak informasi terakhir yang diakses](access_policies_last-accessed.md#last-accessed_tracking-period).

**Untuk melihat kapan peran terakhir digunakan (konsol)**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi, pilih **Peran**.

1. Cari baris peran dengan aktivitas ingin Anda lihat. Anda dapat menggunakan bidang pencarian untuk mempersempit hasil. Lihat kolom **Aktivitas terakhir** untuk melihat jumlah hari sejak peran terakhir digunakan. Jika peran tersebut belum digunakan dalam periode pelacakan, maka tabel akan menampilkan **Tidak ada**. 

1. Pilih nama peran untuk melihat informasi lebih lanjut. Halaman ** Ringkasan** peran juga mencakup **Aktivitas terakhir**, yang menampilkan tanggal terakhir peran digunakan. Jika peran tersebut tidak digunakan dalam 400 hari terakhir, maka **Aktivitas terakhir** menampilkan **Tidak diakses dalam periode pelacakan**.

**Untuk menampilkan waktu terakhir peran digunakan (AWS CLI)**  
`[aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)` - Jalankan perintah ini untuk mengembalikan informasi tentang peran, termasuk objek`RoleLastUsed`. Objek ini berisi `LastUsedDate` dan `Region` yang perannya terakhir digunakan. Jika `RoleLastUsed` ada, tetapi tidak berisi nilai, maka peran tersebut belum pernah digunakan dalam periode pelacakan.

**Untuk melihat kapan peran terakhir digunakan (AWS API)**  
`[GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/GetRole.html)` - Panggil operasi ini untuk mengembalikan informasi tentang peran, termasuk objek`RoleLastUsed`. Objek ini berisi `LastUsedDate` dan `Region` yang perannya terakhir digunakan. Jika `RoleLastUsed` ada, tetapi tidak berisi nilai, maka peran tersebut belum pernah digunakan dalam periode pelacakan.

## Menghapus peran yang terkait dengan layanan
<a name="id_roles_manage_delete_slr"></a>

Metode yang Anda gunakan untuk menghapus peran terkait layanan bergantung pada layanan. Dalam beberapa kasus, Anda tidak perlu menghapus peran terkait layanan secara manual. Misalnya, ketika Anda menyelesaikan tindakan tertentu (seperti menghapus sumber daya) dalam layanan, layanan mungkin akan menghapus peran terkait layanan untuk Anda. Dalam kasus lain, layanan mungkin mendukung penghapusan peran terkait layanan secara manual dari konsol layanan, API, atau AWS CLI. 

Tinjau dokumentasi untuk *[peran terkait layanan](id_roles.md#iam-term-service-linked-role)* di layanan tertaut untuk mempelajari cara menghapus peran. Anda dapat melihat peran yang terkait dengan layanan di akun Anda dengan masuk ke **Peran** IAM di konsol. Peran yang terkait dengan layanan muncul dengan **(Peran yang terkait dengan layanan)** dalam kolom **Entitas terpercaya** di tabel. Banner pada halaman **Ringkasan** peran juga menunjukkan bahwa peran tersebut adalah peran yang terkait dengan layanan.

Jika layanan tidak menyertakan dokumentasi untuk menghapus peran terkait layanan, Anda dapat menggunakan konsol IAM AWS CLI, atau API untuk menghapus peran tersebut.

## Menghapus peran IAM (konsol)
<a name="roles-managingrole-deleting-console"></a>

Saat Anda menggunakan Konsol Manajemen AWS untuk menghapus peran, IAM secara otomatis melepaskan kebijakan terkelola yang terkait dengan peran tersebut. Ini juga secara otomatis menghapus kebijakan sebaris apa pun yang terkait dengan peran, dan profil instans Amazon EC2 apa pun yang berisi peran tersebut. 

**penting**  
Dalam beberapa kasus, peran mungkin berkaitan dengan profil instans Amazon EC2, dan peran serta profil instans mungkin memiliki nama yang sama. Dalam hal ini Anda dapat menggunakan Konsol Manajemen AWS untuk menghapus peran dan profil instance. Pertautan ini terjadi secara otomatis untuk peran dan profil instans yang Anda buat di konsol. Jika Anda membuat peran dari AWS CLI, Alat untuk Windows PowerShell, atau AWS API, maka peran dan profil instance mungkin memiliki nama yang berbeda. Jika demikian, Anda tidak dapat menggunakan konsol untuk menghapusnya. Sebagai gantinya, Anda harus menggunakan AWS CLI, Tools for Windows PowerShell, atau AWS API untuk terlebih dahulu menghapus peran dari profil instance. Kemudian, Anda harus melakukan langkah terpisah untuk menghapus peran tersebut.

**Untuk menghapus peran (konsol)**

1. Masuk ke Konsol Manajemen AWS dan buka konsol IAM di [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Di panel navigasi, pilih **Peran**, lalu centang kotak di samping nama peran yang ingin Anda hapus. 

1. Pilih **Hapus** di bagian atas halaman.

1. Di kotak dialog konfirmasi, tinjau informasi yang terakhir diakses, yang menunjukkan kapan masing-masing peran yang dipilih terakhir mengakses AWS layanan. Ini membantu Anda mengonfirmasi jika peran tersebut saat ini aktif. Jika Anda ingin melanjutkan, masukkan nama peran di kolom input teks dan pilih **Hapus**. Jika Anda yakin, Anda dapat melanjutkan dengan penghapusan meskipun informasi yang terakhir diakses masih dimuat.

**catatan**  
Anda tidak dapat menggunakan konsol untuk menghapus profil instans kecuali itu memiliki nama yang sama dengan peran. Profil instans dihapus sebagai bagian dari proses penghapusan peran sebagaimana dijelaskan dalam prosedur sebelumnya. Untuk menghapus profil instance tanpa juga menghapus peran, Anda harus menggunakan AWS CLI atau AWS API. Untuk informasi selengkapnya, silakan lihat bagian-bagian berikut ini.

## Menghapus peran IAM ()AWS CLI
<a name="roles-managingrole-deleting-cli"></a>

Saat Anda menggunakan AWS CLI untuk menghapus peran, Anda harus terlebih dahulu menghapus kebijakan sebaris yang terkait dengan peran tersebut. Anda juga harus melepaskan kebijakan terkelola yang terkait dengan peran tersebut. Jika Anda ingin menghapus profil instance terkait yang berisi peran, Anda harus menghapusnya secara terpisah.

**Untuk menghapus peran (AWS CLI)**

1. Jika Anda tidak tahu nama peran yang ingin Anda jalankan, jalankan perintah berikut untuk membuat daftar peran di akun Anda:

   ```
   aws iam list-roles
   ```

   Daftar tersebut mencakup Amazon Resource Name (ARN) dari setiap peran. Gunakan nama peran, bukan ARN, untuk merujuk ke peran dengan perintah CLI. Misalnya, jika peran memiliki ARN berikut: `arn:aws:iam::123456789012:role/myrole`, referensi Anda ke peran sebagai **myrole**.

1. Hapus peran dari semua profil instance yang terkait dengan peran tersebut.

   1. Untuk membuat daftar semua profil instans berkaitan dengan peran tersebut, masukkan perintah berikut:

      ```
      aws iam list-instance-profiles-for-role --role-name role-name
      ```

   1. Untuk menghapus peran dari profil instans, masukkan perintah berikut untuk setiap profil instans:

      ```
      aws iam remove-role-from-instance-profile --instance-profile-name instance-profile-name --role-name role-name
      ```

1. Hapus semua kebijakan yang terkait dengan peran tersebut.

   1. Untuk mencantumkan semua kebijakan inline yang ada dalam peran, masukkan perintah berikut:

      ```
      aws iam list-role-policies --role-name role-name
      ```

   1. Untuk menghapus setiap kebijakan sebaris dari peran, masukkan perintah berikut untuk setiap kebijakan: 

      ```
      aws iam delete-role-policy --role-name role-name --policy-name policy-name
      ```

   1. Untuk mencantumkan semua kebijakan terkelola yang dilampirkan ke peran, masukkan perintah berikut:

      ```
      aws iam list-attached-role-policies --role-name role-name
      ```

   1. Untuk melepaskan setiap kebijakan terkelola dari peran, masukkan perintah berikut untuk setiap kebijakan: 

      ```
      aws iam detach-role-policy --role-name role-name --policy-arn policy-arn
      ```

1. Masukkan perintah berikut untuk menghapus peran:

   ```
   aws iam delete-role --role-name role-name
   ```

1. Jika Anda tidak berencana untuk menggunakan ulang profil instans yang terkait dengan peran tersebut, Anda dapat memasukkan perintah berikut untuk menghapusnya:

   ```
   aws iam delete-instance-profile --instance-profile-name instance-profile-name
   ```

## Menghapus peran IAM (API)AWS
<a name="roles-managingrole-deleting-api"></a>

Saat Anda menggunakan API IAM untuk menghapus peran, Anda harus terlebih dahulu menghapus kebijakan sebaris yang terkait dengan peran tersebut. Anda juga harus melepaskan kebijakan terkelola yang terkait dengan peran tersebut. Jika Anda ingin menghapus profil instance terkait yang berisi peran, Anda harus menghapusnya secara terpisah.

**Untuk menghapus peran (AWS API)**

1. Untuk mencantumkan semua profil instance yang terkait dengan peran, hubungi [ListInstanceProfilesForRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfilesForRole.html).

   Untuk menghapus peran dari profil instance, panggil [RemoveRoleFromInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html). Anda harus meneruskan nama peran dan nama profil instans. 

   Jika Anda tidak akan menggunakan ulang profil instans yang terkait dengan peran tersebut, panggil [DeleteInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html) untuk menghapusnya.

1. Untuk mencantumkan semua kebijakan sebaris untuk peran, hubungi [ListRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html).

   Untuk menghapus kebijakan sebaris yang terkait dengan peran, panggil [DeleteRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteRolePolicy.html). Anda harus meneruskan nama peran dan nama kebijakan sebaris. 

1. Untuk mencantumkan semua kebijakan terkelola yang dilampirkan ke peran, hubungi [ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html). 

   Untuk melepaskan kebijakan terkelola yang melekat pada peran, hubungi [DetachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachRolePolicy.html). Anda harus melewati nama peran dan kebijakan terkelola ARN. 

1. Panggil [DeleteRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteRole.html) untuk menghapus peran.

## Informasi Terkait
<a name="roles-managingrole-deleting-related-info"></a>

Untuk informasi umum tentang profil instans, lihat [Gunakan profil contoh](id_roles_use_switch-role-ec2_instance-profiles.md).

Untuk informasi umum tentang peran yang terkait dengan layanan, lihat [Buat peran tertaut layanan](id_roles_create-service-linked-role.md).

# Metode untuk mengambil peran
<a name="id_roles_manage-assume"></a>

Sebelum pengguna, aplikasi, atau layanan dapat menggunakan peran yang Anda buat, Anda harus [memberikan izin untuk beralih ke](id_roles_use_permissions-to-switch.md) peran tersebut. Anda dapat menggunakan kebijakan apa pun yang dilampirkan ke grup atau pengguna untuk memberikan izin yang diperlukan. Setelah izin diberikan, pengguna dapat mengambil peran dari Konsol Manajemen AWS, Alat untuk Windows PowerShell, AWS Command Line Interface (AWS CLI) dan [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)API.

**penting**  
Saat Anda membuat program peran secara terprogram, alih-alih di konsol IAM, Anda memiliki opsi untuk menambahkan `Path` hingga 512 karakter selain `RoleName`, yang panjangnya dapat mencapai 64 karakter. Namun, jika Anda bermaksud menggunakan peran dengan fitur **Switch Role** di Konsol Manajemen AWS, maka gabungan `Path` dan `RoleName` tidak dapat melebihi 64 karakter.

Metode yang digunakan untuk mengambil peran menentukan siapa yang dapat mengambil peran dan berapa lama sesi peran dapat berlangsung. Saat menggunakan operasi `AssumeRole*` API, peran IAM yang Anda asumsikan adalah sumber daya. Pengguna atau peran yang memanggil operasi `AssumeRole*` API adalah prinsipnya.

Tabel berikut membandingkan metode untuk mengasumsikan peran.


|  Metode untuk mengasumsikan peran |  **Siapa yang bisa mengambil peran**  | **Metode untuk menentukan masa pakai kredensi** |  **Masa pakai kredensi (min \$1 maks \$1 default)**  | 
| --- | --- | --- | --- | 
| Konsol Manajemen AWS | Pengguna atau peran¹ (dengan [beralih](id_roles_use_switch-role-console.md) peran) | Durasi sesi maksimum pada Halaman ringkasan Peran | 15 menit \$1 Pengaturan durasi sesi maksimum² \$1 1 jam | 
| Operasi [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html) CLI atau [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API |  Pengguna atau peran¹ | Parameter duration-seconds CLI atau DurationSeconds API | 15 menit \$1 Pengaturan durasi sesi maksimum² \$1 1 jam  | 
| Operasi [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-saml.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-saml.html) CLI atau [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API | Pengguna yang diotentikasi menggunakan SAML | Parameter duration-seconds CLI atau DurationSeconds API | 15 menit \$1 Pengaturan durasi sesi maksimum² \$1 1 jam  | 
| Operasi [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html) CLI atau [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API | Setiap pengguna yang diautentikasi menggunakan penyedia OIDC | Parameter duration-seconds CLI atau DurationSeconds API | 15 menit \$1 Pengaturan durasi sesi maksimum² \$1 1 jam  | 
| [URL Konsol](id_roles_providers_enable-console-custom-url.md) yang dibangun dengan AssumeRole  | Pengguna atau peran | SessionDuration Parameter HTML dalam URL | 15 menit \$1 12 jam \$1 1 jam  | 
| [URL Konsol](id_roles_providers_enable-console-custom-url.md) yang dibangun dengan AssumeRoleWithSAML  | Pengguna yang diotentikasi menggunakan SAML | SessionDuration Parameter HTML dalam URL | 15 menit \$1 12 jam \$1 1 jam | 
| [URL Konsol](id_roles_providers_enable-console-custom-url.md) yang dibangun dengan AssumeRoleWithWebIdentity  | Setiap pengguna yang diautentikasi menggunakan penyedia OIDC | SessionDuration Parameter HTML dalam URL | 15 menit \$1 12 jam \$1 1 jam  | 

¹ Menggunakan kredensi dari satu peran untuk mengambil peran yang berbeda disebut rantai [peran](id_roles.md#iam-term-role-chaining). Saat Anda menggunakan rantai peran, durasi sesi peran dibatasi hingga satu jam. Ini berlaku untuk peralihan Konsol Manajemen AWS peran AWS CLI, dan operasi API. Batasan ini tidak berlaku untuk asumsi awal peran dari kredenal pengguna, atau aplikasi yang berjalan di EC2 instans Amazon yang menggunakan profil instans.

² Pengaturan ini dapat memiliki nilai dari 1 jam hingga 12 jam. Untuk detail tentang pengubahan pengaturan durasi sesi maksimum, lihat [Manajemen peran IAM](id_roles_manage.md). Setelan ini menentukan durasi sesi maksimum yang dapat Anda minta saat Anda mendapatkan kredensial peran. Misalnya, saat Anda menggunakan [AssumeRole\$1](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) Operasi API untuk mengasumsikan peran, Anda dapat menentukan durasi sesi dengan menggunakan parameter `DurationSeconds`. Gunakan parameter ini untuk menentukan panjang durasi sesi peran mulai dari 900 detik (15 menit) hingga pengaturan durasi sesi maksimum untuk peran tersebut. Pengguna IAM yang beralih peran di konsol diberikan durasi sesi maksimum, atau sisa waktu dalam sesi pengguna mereka, mana yang lebih sedikit. Anggaplah Anda menetapkan durasi maksimum 5 jam dalam suatu peran. Pengguna IAM yang telah masuk ke konsol selama 10 jam (dari nilai maksimum standar 12) berganti peran. Durasi sesi peran yang tersedia adalah 2 jam. Untuk mempelajari cara melihat nilai maksimum untuk peran Anda, lihat [Memperbarui durasi sesi maksimum untuk peran](id_roles_update-role-settings.md#id_roles_update-session-duration) nanti di halaman ini.

**Catatan**  
Pengaturan durasi sesi maksimum tidak membatasi sesi yang diambil oleh layanan AWS .
Kredensi peran Amazon EC2 IAM tidak tunduk pada durasi sesi maksimum yang dikonfigurasi dalam peran.
Untuk memungkinkan pengguna untuk mengambil peran saat ini lagi dalam sesi peran, tentukan peran ARN atau Akun AWS ARN sebagai prinsipal dalam kebijakan kepercayaan peran. Layanan AWS yang menyediakan sumber daya komputasi seperti Amazon EC2, Amazon ECS, Amazon EKS, dan Lambda memberikan kredensi sementara dan secara otomatis memperbarui kredensional ini. Ini memastikan bahwa Anda selalu memiliki seperangkat kredensional yang valid. Untuk layanan ini, tidak perlu mengambil peran saat ini lagi untuk mendapatkan kredensi sementara. Namun, jika Anda berniat untuk meneruskan [tag sesi](id_session-tags.md) [atau kebijakan sesi](access_policies.md#policies_session), Anda perlu mengambil peran saat ini lagi. Untuk mempelajari cara memodifikasi kebijakan kepercayaan peran untuk menambahkan peran utama ARN atau Akun AWS ARN, lihat. [Memperbarui kebijakan kepercayaan peran](id_roles_update-role-trust-policy.md)

**Topics**
+ [Beralih dari pengguna ke peran IAM (konsol)](id_roles_use_switch-role-console.md)
+ [Beralih ke peran IAM ()AWS CLI](id_roles_use_switch-role-cli.md)
+ [Beralih ke peran IAM (Alat untuk Windows PowerShell)](id_roles_use_switch-role-twp.md)
+ [Beralih ke peran IAM (AWS API)](id_roles_use_switch-role-api.md)
+ [Menggunakan peran IAM untuk memberikan izin ke aplikasi yang berjalan di instans Amazon EC2](id_roles_use_switch-role-ec2.md)
+ [Gunakan profil contoh](id_roles_use_switch-role-ec2_instance-profiles.md)

# Beralih dari pengguna ke peran IAM (konsol)
<a name="id_roles_use_switch-role-console"></a>

Anda dapat beralih peran saat masuk sebagai pengguna IAM, pengguna di Pusat Identitas IAM, peran federasi SAML, atau peran federasi identitas web. *Peran* menentukan sekumpulan izin yang dapat Anda gunakan untuk mengakses AWS sumber daya yang Anda butuhkan. Namun, Anda tidak masuk ke peran, tetapi setelah masuk sebagai pengguna IAM, Anda dapat beralih ke peran IAM. Sementara waktu ini mengesampingkan izin pengguna awal Anda dan justru memberikan izin yang ditetapkan untuk peran. Perannya bisa di akun Anda sendiri atau lainnya Akun AWS. Untuk informasi lebih lanjut tentang peran, keuntungannya, dan cara membuatnya, lihat [Peran IAM](id_roles.md), dan [Pembuatan peran IAM](id_roles_create.md).

Izin pengguna Anda dan peran apa pun yang Anda alihkan tidak bersifat kumulatif. Hanya satu rangkaian izin yang aktif pada satu waktu. Saat Anda beralih ke suatu peran, sementara Anda meninggalkan izin pengguna dan bekerja dengan izin yang diberikan ke peran tersebut. Saat Anda keluar dari peran, izin pengguna asli Anda dipulihkan secara otomatis.

Saat Anda beralih peran Konsol Manajemen AWS, konsol selalu menggunakan kredenal asli Anda untuk mengotorisasi sakelar. Misalnya, jika Anda beralih ke RoleA, IAM menggunakan kredensi asli Anda untuk menentukan apakah Anda diizinkan untuk mengasumsikan RoleA. Jika Anda kemudian beralih ke *RoleB saat Anda menggunakan RoleA, masih menggunakan kredensi asli **Anda** untuk* mengotorisasi sakelar AWS , bukan kredenal untuk RoleA.

**catatan**  
Saat Anda masuk sebagai pengguna di Pusat Identitas IAM, sebagai peran federasi SAML, atau sebagai peran federasi identitas web, Anda akan mengambil peran IAM saat memulai sesi. Misalnya, ketika pengguna di Pusat Identitas IAM masuk ke portal AWS akses, mereka harus memilih set izin yang berkorelasi dengan peran sebelum mereka dapat mengakses sumber daya. AWS 

## Sesi peran
<a name="id_roles_iam_user-switch-role-sessions"></a>

Saat Anda beralih peran, Konsol Manajemen AWS sesi Anda berlangsung selama 1 jam secara default. Sesi pengguna IAM adalah 12 jam secara default, pengguna lain mungkin memiliki durasi sesi yang berbeda yang ditentukan. Saat Anda beralih peran di konsol, Anda akan diberikan durasi sesi maksimum peran, atau sisa waktu dalam sesi pengguna, mana yang lebih sedikit. Anda tidak dapat memperpanjang durasi sesi dengan mengambil peran.

Misalnya, anggaplah durasi sesi maksimum 10 jam ditetapkan untuk peran. Anda telah masuk ke konsol selama 8 jam ketika Anda memutuskan untuk beralih ke peran. Ada 4 jam tersisa di sesi pengguna Anda, jadi durasi sesi peran yang diizinkan adalah 4 jam, bukan durasi sesi maksimum 10 jam. Tabel berikut menunjukkan cara menentukan durasi sesi untuk pengguna IAM saat berganti peran di dalam konsol.


| Waktu sesi pengguna IAM yang tersisa adalah... | Durasi sesi peran adalah... | 
| --- | --- | 
| Kurang dari durasi sesi maksimum peran | Waktu yang tersisa di sesi pengguna  | 
| Lebih dari durasi sesi maksimum peran | Nilai durasi sesi maksimum | 
| Setara dengan durasi sesi maksimum peran | Nilai durasi sesi maksimum (perkiraan) | 

Menggunakan kredensi dari satu peran untuk mengambil peran yang berbeda disebut rantai [peran](id_roles.md#iam-term-role-chaining). Saat Anda menggunakan rantai peran, durasi sesi dibatasi hingga satu jam, terlepas dari pengaturan durasi sesi maksimum yang dikonfigurasi untuk peran individual. Ini berlaku untuk peralihan Konsol Manajemen AWS peran AWS CLI, dan operasi API.

**catatan**  
Beberapa konsol AWS layanan dapat memperbarui sesi peran Anda secara otomatis ketika berakhir tanpa Anda mengambil tindakan apa pun. Beberapa mungkin akan meminta Anda memuat ulang halaman peramban untuk mengotentikasi ulang sesi Anda.

## Pertimbangan-pertimbangan
<a name="id_roles_iam_user-switch-role-considerations"></a>
+ Anda tidak dapat beralih peran jika Anda masuk sebagai Pengguna root akun AWS. 
+ Pengguna harus diberikan izin untuk beralih peran berdasarkan kebijakan. Untuk petunjuk, lihat [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md).
+ Anda tidak dapat mengganti peran Konsol Manajemen AWS ke peran yang membutuhkan [ExternalId](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id)nilai. Anda hanya dapat beralih ke peran tersebut dengan memanggil [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API yang mendukung parameter `ExternalId`.

## Untuk beralih ke peran
<a name="id_roles_iam_user-switch-role-console-procedure"></a>

1. Ikuti prosedur masuk yang sesuai dengan tipe pengguna Anda seperti yang dijelaskan [di Masuk ke Konsol Manajemen AWS](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) *Panduan AWS Sign-In Pengguna*.

1. Di Konsol Manajemen AWS, pilih nama pengguna Anda di bilah navigasi di kanan atas. Biasanya terlihat seperti ini: ***username*@ *account\$1ID\$1number\$1or\$1alias***.

1. Pilih salah satu metode berikut untuk beralih peran:
   + Pilih **Beralih peran**.
   + Jika Anda telah memilih untuk mendukung multi-sesi, pilih **Tambah sesi** dan pilih **Beralih** peran.
**catatan**  
Anda dapat masuk hingga lima identitas berbeda secara bersamaan dalam satu browser web di Konsol Manajemen AWS file. Untuk detailnya, lihat [Masuk ke beberapa akun](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/multisession.html) di *Panduan Konsol Manajemen AWS Memulai*.

1. Pada halaman **Ganti Peran**, ketik nomor ID akun atau alias akun dan nama peran yang diberikan oleh administrator Anda.
**catatan**  
Jika administrator Anda membuat peran itu dengan sebuah jalur, seperti `division_abc/subdivision_efg/roleToDoX`, maka Anda harus mengetik jalur dan nama lengkap tersebut di kotak **Peran**. Jika Anda hanya mengetik nama peran, atau jika gabungan `Path` dan `RoleName` lebih dari 64 karakter, pergantian peran gagal. Ini adalah batasan cookie peramban yang menyimpan nama peran tersebut. Jika ini terjadi, hubungi administrator Anda dan minta mereka untuk mengurangi ukuran jalur dan nama peran.

1. (Opsional) Anda dapat memasukkan nama tampilan dan memilih warna tampilan yang akan menyoroti peran di bilah navigasi konsol.
   + Untuk **Nama tampilan**, ketik teks yang ingin Anda tampilkan di bilah navigasi sebagai pengganti nama pengguna Anda saat peran ini aktif. Ada saran nama, berdasarkan informasi akun dan peran, tetapi Anda dapat mengubahnya menjadi apa pun yang berarti bagi Anda. 
   + Untuk **warna Tampilan**, pilih warna untuk menyorot nama tampilan.

   Nama dan warna dapat membantu mengingatkan Anda saat peran ini aktif, yang mengubah izin Anda. Misalnya, untuk peran yang memberi Anda akses ke lingkungan pengujian, Anda dapat menentukan **Nama tampilan** dari **Test** dan pilih **Warna** hijau. Untuk peran yang memberi Anda akses ke produksi, Anda dapat menentukan **Nama tampilan** dari **Production** dan pilih merah sebagai **Warna**.

1. Pilih **Ganti Peran**. Nama tampilan dan warna menggantikan nama pengguna Anda pada bilah navigasi, dan Anda dapat mulai menggunakan izin yang diberikan peran tersebut kepada Anda.

1. Setelah Anda menyelesaikan tugas-tugas yang memerlukan peran IAM Anda dapat beralih kembali ke sesi awal Anda. Ini akan menghapus izin tambahan yang diberikan oleh peran dan mengembalikan Anda ke izin standar Anda.

   1. Di konsol IAM, pilih **Nama tampilan** peran Anda di bilah navigasi di kanan atas.

   1. Pilih **Beralih kembali**.

      Misalnya, anggap Anda masuk ke nomor akun `123456789012` menggunakan nama pengguna `Richard`. Setelah menggunakan peran `admin-role`, Anda ingin berhenti menggunakan peran dan kembali ke izin awal. **Untuk berhenti menggunakan peran, pilih peran **admin @ 123456789012**, lalu pilih Beralih kembali.**  
![\[Grafik menemukan fungsi Switch back untuk berhenti menggunakan peran IAM dan kembali ke pengguna asli.\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/role-stop-using.png)

**Tip**  
Beberapa peran terakhir yang Anda gunakan muncul pada menu. Lain kali Anda ingin beralih ke salah satu peran itu, Anda cukup memilih peran yang Anda inginkan. Anda hanya perlu mengetikkan akun dan informasi peran secara manual jika peran tidak ditampilkan di menu.

## Sumber daya tambahan
<a name="id_roles_use_switch-role-console_additional_resources"></a>
+ [Berikan izin pengguna untuk beralih peran](id_roles_use_permissions-to-switch.md)
+ [Berikan izin pengguna untuk meneruskan peran ke layanan AWS](id_roles_use_passrole.md)
+ [Buat peran untuk memberikan izin kepada pengguna IAM](id_roles_create_for-user.md)
+ [Membuat peran untuk mendelegasikan izin ke layanan AWS](id_roles_create_for-service.md)
+ [Memecahkan masalah peran IAM](troubleshoot_roles.md)

# Beralih ke peran IAM ()AWS CLI
<a name="id_roles_use_switch-role-cli"></a>

*Peran* menentukan serangkaian izin yang dapat Anda gunakan untuk mengakses sumber daya AWS yang Anda perlukan. Dalam hal ini, ini mirip dengan [pengguna di AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) (IAM). Saat Anda masuk sebagai pengguna, Anda mendapatkan serangkaian izin tertentu. Namun, Anda tidak masuk ke sebuah peran, tetapi setelah masuk sebagai pengguna, Anda dapat beralih ke sebuah peran. Sementara waktu ini mengesampingkan izin pengguna awal Anda dan justru memberikan izin yang ditetapkan untuk peran. Perannya bisa di akun Anda sendiri atau lainnya Akun AWS. Untuk informasi lebih lanjut tentang peran, keuntungannya, dan cara membuatnya, lihat [Peran IAM](id_roles.md), dan [Pembuatan peran IAM](id_roles_create.md). Untuk mempelajari tentang berbagai metode yang dapat Anda gunakan untuk mengasumsikan peran, lihat [Metode untuk mengambil peran](id_roles_manage-assume.md).

**penting**  
Izin pengguna IAM Anda dan peran apa pun yang Anda asumsikan tidak bersifat kumulatif. Hanya satu rangkaian izin yang aktif pada satu waktu. Saat Anda mengasumsikan suatu peran, sementara waktu Anda meninggalkan izin pengguna dan bekerja dengan izin yang ditetapkan ke peran tersebut. Saat Anda keluar dari peran, izin pengguna asli Anda dipulihkan secara otomatis.

Anda dapat menggunakan peran untuk menjalankan AWS CLI perintah saat Anda masuk sebagai pengguna IAM. Anda juga dapat menggunakan peran untuk menjalankan AWS CLI perintah ketika Anda masuk sebagai [pengguna yang diautentikasi secara eksternal](id_roles_providers.md) ([SALL](id_roles_providers_saml.md) atau [OIDC](id_roles_providers_oidc.md)) yang sudah menggunakan peran. Selain itu, Anda dapat menggunakan peran untuk menjalankan AWS CLI perintah dari dalam instans Amazon EC2 yang dilampirkan ke peran melalui profil instance-nya. Anda tidak dapat mengambil peran saat masuk sebagai Pengguna root akun AWS.

[**Rantai peran**](id_roles.md#iam-term-role-chaining) — Anda juga dapat menggunakan rantai peran, yang menggunakan izin dari peran untuk mengakses peran kedua.

Secara default, sesi peran Anda berlangsung selama satu jam. Saat Anda mengasumsikan peran dengan menggunakan `assume-role*` operasi CLI, Anda dapat menentukan nilai untuk parameter `duration-seconds`. Nilai ini dapat berkisar dari 900 detik (15 menit) hingga pengaturan durasi sesi maksimum untuk peran tersebut. Jika Anda beralih peran di konsol, durasi sesi Anda dibatasi hingga maksimal satu jam. Untuk mempelajari cara melihat nilai maksimum untuk peran Anda, lihat [Memperbarui durasi sesi maksimum untuk peran](id_roles_update-role-settings.md#id_roles_update-session-duration). 

Saat Anda menggunakan rantai peran, kredensial baru Anda dibatasi hingga durasi maksimum satu jam. Jika Anda kemudian menggunakan parameter `duration-seconds` untuk memberikan nilai lebih dari satu jam, operasi gagal.

## Skenario contoh: Beralih ke peran produksi
<a name="switch-role-cli-scenario-prod-env"></a>

Bayangkan bahwa Anda adalah pengguna IAM untuk bekerja di lingkungan pengembangan. Dalam skenario ini, Anda terkadang perlu bekerja dengan lingkungan produksi pada baris perintah dengan [AWS CLI](https://aws.amazon.com/cli/). Anda sudah memiliki kredensial access key yang tersedia untuk Anda. Ini dapat berupa key pair akses yang ditetapkan untuk pengguna IAM standar Anda. Atau, jika Anda masuk sebagai prinsipal federasi SAFL atau OIDC, itu bisa menjadi access key pair untuk peran yang awalnya ditugaskan kepada Anda. Jika izin Anda saat ini memberi Anda kemampuan untuk mengambil peran IAM tertentu, maka Anda dapat mengidentifikasi peran tersebut dalam “profil” dalam file AWS CLI konfigurasi. Perintah tersebut kemudian dijalankan atas izin peran IAM yang ditentukan, bukan identitas awal. Perhatikan bahwa ketika Anda menentukan profil itu dalam sebuah AWS CLI perintah, Anda menggunakan peran baru. Dalam situasi ini, Anda tidak dapat menggunakan izin awal dalam akun pengembangan pada saat bersamaan. Alasannya adalah bahwa hanya satu rangkaian izin yang dapat berlaku pada satu waktu.

**catatan**  
Untuk tujuan keamanan, administrator dapat [meninjau AWS CloudTrail log](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds) untuk mengetahui siapa yang melakukan tindakan. AWS Administrator Anda mungkin akan meminta Anda menentukan identitas sumber atau nama sesi peran ketika Anda mengambil peran tersebut. Untuk informasi selengkapnya, lihat [`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity) dan [`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname).

**Untuk beralih ke peran produksi (AWS CLI)**

1. <a name="step-configure-default"></a>Jika Anda belum pernah menggunakan AWS CLI, maka Anda harus terlebih dahulu mengkonfigurasi profil CLI default Anda. Buka prompt perintah dan atur AWS CLI instalasi Anda untuk menggunakan kunci akses dari pengguna IAM Anda atau dari peran federasi Anda. Untuk informasi lebih lanjut, lihat [Mengonfigurasi AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-quick-configuration) di *Panduan Pengguna AWS Command Line Interface *.

   Jalankan perintah [aws configure](https://docs.aws.amazon.com/cli/latest/reference/configure/) sebagai berikut:

   ```
   aws configure
   ```

   Saat diminta, berikan informasi berikut:

   ```
   AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
   AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   Default region name [None]: us-east-2
   Default output format [None]: json
   ```

1. Buat profil baru untuk peran dalam `.aws/config` file dalam Unix atau Linux, atau `C:\Users\USERNAME\.aws\config` file dalam Windows. Contoh berikut membuat sebuah profil bernama `prodaccess` yang beralih ke peran `ProductionAccessRole` dalam akun `123456789012`. Anda mendapatkan peran ARN dari administrator akun yang membuat peran tersebut. Ketika profil ini dipanggil, akan AWS CLI menggunakan kredensil `source_profile` untuk meminta kredensil untuk peran tersebut. Oleh karena itu, identitas direferensikan karena `source_profile` harus memiliki izin `sts:AssumeRole` untuk peran yang ditentukan dalam `role_arn`.

   ```
   [profile prodaccess]
       role_arn = arn:aws:iam::123456789012:role/ProductionAccessRole
       source_profile = default
   ```

1. Setelah Anda membuat profil baru, AWS CLI perintah apa pun yang menentukan parameter `--profile prodaccess` berjalan di bawah izin yang dilampirkan ke peran IAM, `ProductionAccessRole` bukan pengguna default.

   ```
   aws iam list-users --profile prodaccess
   ```

   Perintah ini berfungsi jika izin yang ditetapkan ke `ProductionAccessRole` mengaktifkan pencatuman pengguna di akun AWS saat ini.

1. Untuk kembali ke izin yang diberikan oleh kredensial asli Anda, jalankan perintah tanpa parameter `--profile`. AWS CLI Kembali menggunakan kredensil di profil default Anda, yang Anda konfigurasikan. [Step 1](#step-configure-default)

Untuk informasi selengkapnya, lihat [Mengasumsikan Peran](https://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html) dalam *Panduan AWS Command Line Interface Pengguna*.

## Skenario contoh: Menginzinkan peran profil instans untuk beralih ke peran dalam akun lain
<a name="switch-role-cli-scenario-ec2-instance"></a>

Bayangkan Anda menggunakan dua Akun AWS, dan Anda ingin mengizinkan aplikasi yang berjalan pada instans Amazon EC2 untuk menjalankan [AWS CLI](https://aws.amazon.com/cli/)perintah di kedua akun. Anggap bahwa instans EC2 ada di akun `111111111111`. Instance tersebut menyertakan peran profil `abcd` instance yang memungkinkan aplikasi melakukan tugas Amazon S3 hanya-baca di bucket dalam akun `amzn-s3-demo-bucket1` yang sama. `111111111111` Namun, aplikasi tersebut juga harus diizinkan untuk mengambil peran lintas akun `efgh` untuk melakukan tugas di akun `222222222222`. Untuk melakukannya, peran profil instans EC2 `abcd` harus memiliki kebijakan izin berikut:

***Kebijakan izin peran akun 1111111111 `abcd`***

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1/*",
                "arn:aws:s3:::amzn-s3-demo-bucket1"
            ]
        },
        {
            "Sid": "AllowIPToAssumeCrossAccountRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::222222222222:role/efgh"
        }
    ]
}
```

------

Anggap bahwa peran lintas akun `efgh` memungkinkan tugas Amazon S3 hanya baca di bucket `amzn-s3-demo-bucket2` dalam akun `222222222222` yang sama. Untuk melakukannya, peran lintas akun `efgh` harus memiliki kebijakan izin berikut:

***Kebijakan izin peran akun 2222222222 `efgh`***

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket2/*",
                "arn:aws:s3:::amzn-s3-demo-bucket2"
            ]
        }
    ]
}
```

------

Peran `efgh` harus memungkinkan peran profil instans `abcd` untuk mengasumsikannya. Untuk melakukannya, peran `efgh` harus memiliki kebijakan kepercayaan berikut:

***Akun 222222222222 kebijakan kepercayaan peran `efgh`***

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "efghTrustPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"}
        }
    ]
}
```

------

Untuk kemudian menjalankan AWS CLI perintah di akun`222222222222`, Anda harus memperbarui file konfigurasi CLI. Identifikasi peran `efgh` sebagai "profil" dan peran profil instans EC2 `abcd` sebagai "sumber kredensial" dalam file konfigurasi AWS CLI . Kemudian perintah CLI Anda dijalankan dengan izin peran `efgh`, bukan peran `abcd` asli.

**catatan**  
Untuk tujuan keamanan, Anda dapat menggunakan AWS CloudTrail untuk mengaudit penggunaan peran dalam akun. Untuk membedakan sesi peran ketika peran digunakan oleh prinsipal yang berbeda di log CloudTrail , Anda dapat menggunakan nama sesi peran. Ketika AWS CLI mengambil peran atas nama pengguna seperti yang dijelaskan dalam topik ini, nama sesi peran secara otomatis dibuat sebagai`AWS-CLI-session-nnnnnnnn`. Berikut *nnnnnnnn* adalah bilangan bulat yang mewakili waktu dalam waktu [epoch Unix](http://wikipedia.org/wiki/Unix_time) (jumlah detik sejak tengah malam UTC pada 1 Januari 1970). Untuk informasi selengkapnya, lihat [Referensi CloudTrail Acara](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/eventreference.html) di *Panduan AWS CloudTrail Pengguna*.

**Untuk mengizinkan peran profil instans EC2 beralih ke peran lintas akun (AWS CLI)**

1. Anda tidak perlu mengonfigurasi profil CLI default. Sebagai gantinya, Anda dapat memuat kredensial dari metadata profil instans EC2. Buat profil baru untuk peran dalam file `.aws/config`. Contoh berikut membuat profil `instancecrossaccount` yang beralih ke peran `efgh` dalam akun `222222222222`. Saat profil ini dipanggil, AWS CLI menggunakan kredensial metadata profil instans EC2 untuk meminta kredensial bagi peran tersebut. Karena itu, peran profil instans EC2 harus memiliki izin `sts:AssumeRole` ke peran yang ditentukan dalam `role_arn`.

   ```
   [profile instancecrossaccount]
   role_arn = arn:aws:iam::222222222222:role/efgh
   credential_source = Ec2InstanceMetadata
   ```

1. Setelah Anda membuat profil baru, AWS CLI perintah apa pun yang menentukan parameter `--profile instancecrossaccount` berjalan di bawah izin yang dilampirkan ke `efgh` peran di akun. `222222222222`

   ```
   aws s3 ls amzn-s3-demo-bucket2 --profile instancecrossaccount
   ```

   Perintah ini berfungsi jika izin yang ditetapkan ke `efgh` peran memungkinkan daftar pengguna saat ini Akun AWS.

1. Untuk kembali ke izin profil instans EC2 asli di akun `111111111111`, jalankan perintah CLI tanpa parameter `--profile`.

Untuk informasi selengkapnya, lihat [Mengasumsikan Peran](https://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html) dalam *Panduan AWS Command Line Interface Pengguna*.

# Beralih ke peran IAM (Alat untuk Windows PowerShell)
<a name="id_roles_use_switch-role-twp"></a>

*Peran* menentukan serangkaian izin yang dapat Anda gunakan untuk mengakses sumber daya AWS yang Anda perlukan. Dalam hal ini, ini mirip dengan [pengguna di AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) (IAM). Saat Anda masuk sebagai pengguna, Anda mendapatkan serangkaian izin tertentu. Namun, Anda tidak masuk ke sebuah peran, tetapi setelah masuk, Anda dapat beralih ke sebuah peran. Sementara waktu ini mengesampingkan izin pengguna awal Anda dan justru memberikan izin yang ditetapkan untuk peran. Perannya bisa di akun Anda sendiri atau lainnya Akun AWS. Untuk informasi lebih lanjut tentang peran, keuntungannya, dan cara membuatnya, lihat [Peran IAM](id_roles.md), dan [Pembuatan peran IAM](id_roles_create.md).

**penting**  
Izin pengguna IAM Anda dan peran apa pun yang Anda asumsikan tidak bersifat kumulatif. Hanya satu rangkaian izin yang aktif pada satu waktu. Saat Anda beralih ke suatu peran, sementara Anda meninggalkan izin pengguna dan bekerja dengan izin yang diberikan ke peran tersebut. Saat Anda keluar dari peran, izin pengguna asli Anda dipulihkan secara otomatis.

Bagian ini menjelaskan cara berganti peran ketika Anda bekerja di baris perintah dengan AWS Tools for Windows PowerShell.

Bayangkan Anda memiliki akun di lingkungan pengembangan dan Anda sesekali perlu bekerja dengan lingkungan produksi di baris perintah menggunakan [Alat untuk Windows PowerShell](https://aws.amazon.com/powershell/). Anda sudah memiliki satu set kredensial access key yang tersedia untuk Anda. Ini dapat berupa akses key pair yang ditetapkan untuk pengguna IAM standar Anda. Atau, jika Anda masuk sebagai prinsipal federasi SAFL atau OIDC, mereka bisa menjadi access key pair untuk peran yang awalnya diberikan kepada Anda. Anda dapat menggunakan kredensial ini untuk menjalankan `Use-STSRole` cmdlet yang melewati ARN peran baru sebagai parameter. Perintah tersebut mengembalikan kredensial keamanansementara untuk peran yang diminta. Kemudian, Anda dapat menggunakan kredensial tersebut dalam menurunkan perintah PowerShell dengan izin peran untuk mengakses sumber daya dalam produksi. Saat menggunakan peran tersebut, Anda tidak dapat menggunakan izin pengguna dalam akun Pengembangan karena hanya satu rangkaian izin yang berlaku pada satu waktu.

**catatan**  
Untuk tujuan keamanan, administrator dapat [meninjau AWS CloudTrail log](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds) untuk mengetahui siapa yang melakukan tindakan. AWS Administrator Anda mungkin akan meminta Anda menentukan identitas sumber atau nama sesi peran ketika Anda mengambil peran tersebut. Untuk informasi selengkapnya, lihat [`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity) dan [`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname).

Perhatikan bahwa semua kunci akses dan token hanyalah contoh dan tidak dapat digunakan seperti yang ditunjukkan. Ganti dengan nilai yang sesuai dari lingkungan langsung Anda.

**Untuk beralih ke peran IAM (Alat untuk Windows PowerShell)**

1. Buka prompt PowerShell perintah dan konfigurasikan profil default untuk menggunakan kunci akses dari pengguna IAM Anda saat ini atau dari peran federasi Anda. Jika sebelumnya Anda telah menggunakan Alat untuk Windows PowerShell, maka ini kemungkinan sudah dilakukan. Perhatikan bahwa Anda dapat beralih peran hanya jika Anda masuk sebagai pengguna IAM, bukan. Pengguna root akun AWS

   ```
   PS C:\> Set-AWSCredentials -AccessKey AKIAIOSFODNN7EXAMPLE -SecretKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -StoreAs MyMainUserProfile
   PS C:\> Initialize-AWSDefaults -ProfileName MyMainUserProfile -Region us-east-2
   ```

   Untuk informasi selengkapnya, lihat [Menggunakan AWS Kredensial](https://docs.aws.amazon.com/powershell/latest/userguide/specifying-your-aws-credentials.html) di *Alat AWS untuk PowerShell Panduan Pengguna*.

1. Untuk mendapatkan kredensial peran baru, jalankan perintah berikut untuk beralih ke peran `RoleName` dalam akun 123456789012. Anda mendapatkan peran ARN dari administrator akun yang membuat peran tersebut. Perintah ini mengharuskan Anda untuk juga memberikan nama sesi. Anda dapat memilih teks apa pun untuk itu. Perintah berikut meminta kredensial dan kemudian menangkap objek properti `Credentials` dari objek hasil yang dikembalikan dan menyimpannya dalam variabel `$Creds`.

   ```
   PS C:\> $Creds = (Use-STSRole -RoleArn "arn:aws:iam::123456789012:role/RoleName" -RoleSessionName "MyRoleSessionName").Credentials
   ```

   `$Creds` adalah objek yang sekarang berisi elemen `AccessKeyId`, `SecretAccessKey`, dan `SessionToken` yang Anda butuhkan dalam langkah-langkah berikut ini. Perintah sampel berikut ini menggambarkan nilai-nilai umum:

   ```
   PS C:\> $Creds.AccessKeyId
   AKIAIOSFODNN7EXAMPLE
   
   PS C:\> $Creds.SecretAccessKey
   wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   
   PS C:\> $Creds.SessionToken
   AQoDYXdzEGcaEXAMPLE2gsYULo+Im5ZEXAMPLEeYjs1M2FUIgIJx9tQqNMBEXAMPLECvSRyh0FW7jEXAMPLEW+vE/7s1HRp
   XviG7b+qYf4nD00EXAMPLEmj4wxS04L/uZEXAMPLECihzFB5lTYLto9dyBgSDyEXAMPLE9/g7QRUhZp4bqbEXAMPLENwGPy
   Oj59pFA4lNKCIkVgkREXAMPLEjlzxQ7y52gekeVEXAMPLEDiB9ST3UuysgsKdEXAMPLE1TVastU1A0SKFEXAMPLEiywCC/C
   s8EXAMPLEpZgOs+6hz4AP4KEXAMPLERbASP+4eZScEXAMPLEsnf87eNhyDHq6ikBQ==
   
   PS C:\> $Creds.Expiration
   Thursday, June 18, 2018 2:28:31 PM
   ```

1. Untuk menggunakan kredensial ini untuk perintah berikutnya, sertakan mereka dengan parameter `-Credential`. Misalnya, perintah berikut menggunakan kredensial dari peran dan bekerja hanya jika peran tersebut diberik izin`iam:ListRoles` dan karenanya dapat menjalankan `Get-IAMRoles` cmdlet:

   ```
           PS C:\> get-iamroles -Credential $Creds
   ```

1. Untuk kembali ke kredensi asli Anda, cukup berhenti menggunakan `-Credentials $Creds` parameter dan izinkan PowerShell untuk kembali ke kredensil yang disimpan di profil default.

# Beralih ke peran IAM (AWS API)
<a name="id_roles_use_switch-role-api"></a>

*Peran* menentukan serangkaian izin yang dapat Anda gunakan untuk mengakses sumber daya AWS . Dalam hal itu, ini mirip dengan [Pengguna IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html). Seorang kepala sekolah (orang atau aplikasi) mengambil peran untuk menerima izin sementara untuk melaksanakan tugas yang diperlukan dan berinteraksi dengan AWS sumber daya. Perannya bisa di akun Anda sendiri atau lainnya Akun AWS. Untuk informasi lebih lanjut tentang peran, keuntungannya, dan cara membuatnya, lihat [Peran IAM](id_roles.md), dan [Pembuatan peran IAM](id_roles_create.md). Untuk mempelajari tentang berbagai metode yang dapat Anda gunakan untuk mengasumsikan peran, lihat [Metode untuk mengambil peran](id_roles_manage-assume.md).

**penting**  
Izin pengguna IAM Anda dan peran apa pun yang Anda asumsikan tidak bersifat kumulatif. Hanya satu rangkaian izin yang aktif pada satu waktu. Saat Anda mengasumsikan suatu peran, sementara waktu Anda meninggalkan izin pengguna dan bekerja dengan izin yang ditetapkan ke peran tersebut. Saat Anda keluar dari peran tersebut, izin asli Anda akan dipulihkan secara otomatis.

Untuk mengambil peran, aplikasi memanggil operasi AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)API dan meneruskan ARN peran yang akan digunakan. Operasi membuat sesi baru dengan kredensial sementara. Sesi ini memiliki izin yang sama dengan kebijakan berbasis identitas untuk peran tersebut. 

Saat Anda menelepon [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html), Anda secara opsional dapat meneruskan [kebijakan sesi](access_policies.md#policies_session) inline atau terkelola. Kebijakan sesi adalah kebijakan lanjutan yang Anda teruskan sebagai parameter saat Anda membuat sesi kredensyal sementara secara terprogram untuk peran atau sesi pengguna gabungan. Anda dapat menyampaikan satu dokumen kebijakan sesi inline JSON menggunakan parameter `Policy`. Anda dapat menggunakan parameter `PolicyArns` untuk menentukan hingga 10 kebijakan sesi terkelola. Izin sesi yang dihasilkan adalah titik pertemuan antara kebijakan berbasis identitas entitas dan kebijakan sesi. Kebijakan sesi berguna saat Anda perlu memberikan kredensial sementara kepada orang lain. Anda dapat menggunakan kredensial sementara peran tersebut dalam panggilan API AWS berikutnya untuk mengakses sumber daya di akun yang memiliki peran tersebut. Anda tidak dapat menggunakan kebijakan sesi untuk memberikan lebih banyak izin daripada yang diizinkan oleh kebijakan berbasis identitas. Untuk mempelajari selengkapnya tentang cara AWS menentukan izin efektif suatu peran, lihat[Logika evaluasi kebijakan](reference_policies_evaluation-logic.md). 

![\[PermissionsWhenPassingRoles_Diagram\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/role_passed_policy_permissions.png)


Anda dapat memanggil `AssumeRole` saat Anda masuk sebagai pengguna IAM, atau sebagai [pengguna terotentikasi secara eksternal](id_roles_providers.md) ([SAML](id_roles_providers_saml.md) atau [OIDC](id_roles_providers_oidc.md)) yang sudah menggunakan peran. Anda juga dapat menggunakan [*rantai peran*](id_roles.md#iam-term-role-chaining), yang menggunakan peran untuk mengasumsikan peran kedua. Anda tidak dapat mengambil peran saat masuk sebagai Pengguna root akun AWS.

Secara default, sesi peran Anda berlangsung selama satu jam. Saat Anda mengambil peran ini menggunakan operasi AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)API, Anda dapat menentukan nilai untuk `DurationSeconds` parameter tersebut. Nilai ini dapat berkisar dari 900 detik (15 menit) hingga pengaturan durasi sesi maksimum untuk peran tersebut. Untuk mempelajari cara melihat nilai maksimum untuk peran Anda, lihat [Memperbarui durasi sesi maksimum untuk peran](id_roles_update-role-settings.md#id_roles_update-session-duration). 

Jika Anda menggunakan rantai peran, sesi Anda akan dibatasi hingga maksimum satu jam. Jika Anda kemudian menggunakan parameter `DurationSeconds` untuk memberikan nilai lebih dari satu jam, operasi gagal.

**catatan**  
Untuk tujuan keamanan, administrator dapat [meninjau AWS CloudTrail log](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds) untuk mengetahui siapa yang melakukan tindakan. AWS Administrator Anda mungkin akan meminta Anda menentukan identitas sumber atau nama sesi peran ketika Anda mengambil peran tersebut. Untuk informasi selengkapnya, lihat [`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity) dan [`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname).

Contoh kode berikut menunjukkan cara membuat pengguna dan mengambil peran.

**Awas**  
Untuk menghindari risiko keamanan, jangan gunakan pengguna IAM untuk otentikasi saat mengembangkan perangkat lunak yang dibuat khusus atau bekerja dengan data nyata. Sebaliknya, gunakan federasi dengan penyedia identitas seperti [AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html).
+ Buat pengguna tanpa izin.
+ Buat peran yang memberikan izin untuk mencantumkan bucket Amazon S3 untuk akun tersebut.
+ Tambahkan kebijakan agar pengguna dapat mengambil peran tersebut.
+ Asumsikan peran dan daftar bucket S3 menggunakan kredensyal sementara, lalu bersihkan sumber daya.

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkap dan pelajari cara menyiapkan dan menjalankan di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/IAM#code-examples). 

```
global using Amazon.IdentityManagement;
global using Amazon.S3;
global using Amazon.SecurityToken;
global using IAMActions;
global using IamScenariosCommon;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using Microsoft.Extensions.Logging;
global using Microsoft.Extensions.Logging.Console;
global using Microsoft.Extensions.Logging.Debug;


namespace IAMActions;

public class IAMWrapper
{
    private readonly IAmazonIdentityManagementService _IAMService;

    /// <summary>
    /// Constructor for the IAMWrapper class.
    /// </summary>
    /// <param name="IAMService">An IAM client object.</param>
    public IAMWrapper(IAmazonIdentityManagementService IAMService)
    {
        _IAMService = IAMService;
    }

    /// <summary>
    /// Attach an IAM policy to a role.
    /// </summary>
    /// <param name="policyArn">The policy to attach.</param>
    /// <param name="roleName">The role that the policy will be attached to.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> AttachRolePolicyAsync(string policyArn, string roleName)
    {
        var response = await _IAMService.AttachRolePolicyAsync(new AttachRolePolicyRequest
        {
            PolicyArn = policyArn,
            RoleName = roleName,
        });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Create an IAM access key for a user.
    /// </summary>
    /// <param name="userName">The username for which to create the IAM access
    /// key.</param>
    /// <returns>The AccessKey.</returns>
    public async Task<AccessKey> CreateAccessKeyAsync(string userName)
    {
        var response = await _IAMService.CreateAccessKeyAsync(new CreateAccessKeyRequest
        {
            UserName = userName,
        });

        return response.AccessKey;

    }


    /// <summary>
    /// Create an IAM policy.
    /// </summary>
    /// <param name="policyName">The name to give the new IAM policy.</param>
    /// <param name="policyDocument">The policy document for the new policy.</param>
    /// <returns>The new IAM policy object.</returns>
    public async Task<ManagedPolicy> CreatePolicyAsync(string policyName, string policyDocument)
    {
        var response = await _IAMService.CreatePolicyAsync(new CreatePolicyRequest
        {
            PolicyDocument = policyDocument,
            PolicyName = policyName,
        });

        return response.Policy;
    }


    /// <summary>
    /// Create a new IAM role.
    /// </summary>
    /// <param name="roleName">The name of the IAM role.</param>
    /// <param name="rolePolicyDocument">The name of the IAM policy document
    /// for the new role.</param>
    /// <returns>The Amazon Resource Name (ARN) of the role.</returns>
    public async Task<string> CreateRoleAsync(string roleName, string rolePolicyDocument)
    {
        var request = new CreateRoleRequest
        {
            RoleName = roleName,
            AssumeRolePolicyDocument = rolePolicyDocument,
        };

        var response = await _IAMService.CreateRoleAsync(request);
        return response.Role.Arn;
    }


    /// <summary>
    /// Create an IAM service-linked role.
    /// </summary>
    /// <param name="serviceName">The name of the AWS Service.</param>
    /// <param name="description">A description of the IAM service-linked role.</param>
    /// <returns>The IAM role that was created.</returns>
    public async Task<Role> CreateServiceLinkedRoleAsync(string serviceName, string description)
    {
        var request = new CreateServiceLinkedRoleRequest
        {
            AWSServiceName = serviceName,
            Description = description
        };

        var response = await _IAMService.CreateServiceLinkedRoleAsync(request);
        return response.Role;
    }


    /// <summary>
    /// Create an IAM user.
    /// </summary>
    /// <param name="userName">The username for the new IAM user.</param>
    /// <returns>The IAM user that was created.</returns>
    public async Task<User> CreateUserAsync(string userName)
    {
        var response = await _IAMService.CreateUserAsync(new CreateUserRequest { UserName = userName });
        return response.User;
    }


    /// <summary>
    /// Delete an IAM user's access key.
    /// </summary>
    /// <param name="accessKeyId">The Id for the IAM access key.</param>
    /// <param name="userName">The username of the user that owns the IAM
    /// access key.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteAccessKeyAsync(string accessKeyId, string userName)
    {
        var response = await _IAMService.DeleteAccessKeyAsync(new DeleteAccessKeyRequest
        {
            AccessKeyId = accessKeyId,
            UserName = userName,
        });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM policy.
    /// </summary>
    /// <param name="policyArn">The Amazon Resource Name (ARN) of the policy to
    /// delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeletePolicyAsync(string policyArn)
    {
        var response = await _IAMService.DeletePolicyAsync(new DeletePolicyRequest { PolicyArn = policyArn });
        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM role.
    /// </summary>
    /// <param name="roleName">The name of the IAM role to delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteRoleAsync(string roleName)
    {
        var response = await _IAMService.DeleteRoleAsync(new DeleteRoleRequest { RoleName = roleName });
        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM role policy.
    /// </summary>
    /// <param name="roleName">The name of the IAM role.</param>
    /// <param name="policyName">The name of the IAM role policy to delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteRolePolicyAsync(string roleName, string policyName)
    {
        var response = await _IAMService.DeleteRolePolicyAsync(new DeleteRolePolicyRequest
        {
            PolicyName = policyName,
            RoleName = roleName,
        });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM user.
    /// </summary>
    /// <param name="userName">The username of the IAM user to delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteUserAsync(string userName)
    {
        var response = await _IAMService.DeleteUserAsync(new DeleteUserRequest { UserName = userName });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM user policy.
    /// </summary>
    /// <param name="policyName">The name of the IAM policy to delete.</param>
    /// <param name="userName">The username of the IAM user.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteUserPolicyAsync(string policyName, string userName)
    {
        var response = await _IAMService.DeleteUserPolicyAsync(new DeleteUserPolicyRequest { PolicyName = policyName, UserName = userName });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Detach an IAM policy from an IAM role.
    /// </summary>
    /// <param name="policyArn">The Amazon Resource Name (ARN) of the IAM policy.</param>
    /// <param name="roleName">The name of the IAM role.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DetachRolePolicyAsync(string policyArn, string roleName)
    {
        var response = await _IAMService.DetachRolePolicyAsync(new DetachRolePolicyRequest
        {
            PolicyArn = policyArn,
            RoleName = roleName,
        });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Gets the IAM password policy for an AWS account.
    /// </summary>
    /// <returns>The PasswordPolicy for the AWS account.</returns>
    public async Task<PasswordPolicy> GetAccountPasswordPolicyAsync()
    {
        var response = await _IAMService.GetAccountPasswordPolicyAsync(new GetAccountPasswordPolicyRequest());
        return response.PasswordPolicy;
    }


    /// <summary>
    /// Get information about an IAM policy.
    /// </summary>
    /// <param name="policyArn">The IAM policy to retrieve information for.</param>
    /// <returns>The IAM policy.</returns>
    public async Task<ManagedPolicy> GetPolicyAsync(string policyArn)
    {

        var response = await _IAMService.GetPolicyAsync(new GetPolicyRequest { PolicyArn = policyArn });
        return response.Policy;
    }


    /// <summary>
    /// Get information about an IAM role.
    /// </summary>
    /// <param name="roleName">The name of the IAM role to retrieve information
    /// for.</param>
    /// <returns>The IAM role that was retrieved.</returns>
    public async Task<Role> GetRoleAsync(string roleName)
    {
        var response = await _IAMService.GetRoleAsync(new GetRoleRequest
        {
            RoleName = roleName,
        });

        return response.Role;
    }


    /// <summary>
    /// Get information about an IAM user.
    /// </summary>
    /// <param name="userName">The username of the user.</param>
    /// <returns>An IAM user object.</returns>
    public async Task<User> GetUserAsync(string userName)
    {
        var response = await _IAMService.GetUserAsync(new GetUserRequest { UserName = userName });
        return response.User;
    }


    /// <summary>
    /// List the IAM role policies that are attached to an IAM role.
    /// </summary>
    /// <param name="roleName">The IAM role to list IAM policies for.</param>
    /// <returns>A list of the IAM policies attached to the IAM role.</returns>
    public async Task<List<AttachedPolicyType>> ListAttachedRolePoliciesAsync(string roleName)
    {
        var attachedPolicies = new List<AttachedPolicyType>();
        var attachedRolePoliciesPaginator = _IAMService.Paginators.ListAttachedRolePolicies(new ListAttachedRolePoliciesRequest { RoleName = roleName });

        await foreach (var response in attachedRolePoliciesPaginator.Responses)
        {
            attachedPolicies.AddRange(response.AttachedPolicies);
        }

        return attachedPolicies;
    }


    /// <summary>
    /// List IAM groups.
    /// </summary>
    /// <returns>A list of IAM groups.</returns>
    public async Task<List<Group>> ListGroupsAsync()
    {
        var groupsPaginator = _IAMService.Paginators.ListGroups(new ListGroupsRequest());
        var groups = new List<Group>();

        await foreach (var response in groupsPaginator.Responses)
        {
            groups.AddRange(response.Groups);
        }

        return groups;
    }


    /// <summary>
    /// List IAM policies.
    /// </summary>
    /// <returns>A list of the IAM policies.</returns>
    public async Task<List<ManagedPolicy>> ListPoliciesAsync()
    {
        var listPoliciesPaginator = _IAMService.Paginators.ListPolicies(new ListPoliciesRequest());
        var policies = new List<ManagedPolicy>();

        await foreach (var response in listPoliciesPaginator.Responses)
        {
            policies.AddRange(response.Policies);
        }

        return policies;
    }


    /// <summary>
    /// List IAM role policies.
    /// </summary>
    /// <param name="roleName">The IAM role for which to list IAM policies.</param>
    /// <returns>A list of IAM policy names.</returns>
    public async Task<List<string>> ListRolePoliciesAsync(string roleName)
    {
        var listRolePoliciesPaginator = _IAMService.Paginators.ListRolePolicies(new ListRolePoliciesRequest { RoleName = roleName });
        var policyNames = new List<string>();

        await foreach (var response in listRolePoliciesPaginator.Responses)
        {
            policyNames.AddRange(response.PolicyNames);
        }

        return policyNames;
    }


    /// <summary>
    /// List IAM roles.
    /// </summary>
    /// <returns>A list of IAM roles.</returns>
    public async Task<List<Role>> ListRolesAsync()
    {
        var listRolesPaginator = _IAMService.Paginators.ListRoles(new ListRolesRequest());
        var roles = new List<Role>();

        await foreach (var response in listRolesPaginator.Responses)
        {
            roles.AddRange(response.Roles);
        }

        return roles;
    }


    /// <summary>
    /// List SAML authentication providers.
    /// </summary>
    /// <returns>A list of SAML providers.</returns>
    public async Task<List<SAMLProviderListEntry>> ListSAMLProvidersAsync()
    {
        var response = await _IAMService.ListSAMLProvidersAsync(new ListSAMLProvidersRequest());
        return response.SAMLProviderList;
    }


    /// <summary>
    /// List IAM users.
    /// </summary>
    /// <returns>A list of IAM users.</returns>
    public async Task<List<User>> ListUsersAsync()
    {
        var listUsersPaginator = _IAMService.Paginators.ListUsers(new ListUsersRequest());
        var users = new List<User>();

        await foreach (var response in listUsersPaginator.Responses)
        {
            users.AddRange(response.Users);
        }

        return users;
    }


    /// <summary>
    /// Update the inline policy document embedded in a role.
    /// </summary>
    /// <param name="policyName">The name of the policy to embed.</param>
    /// <param name="roleName">The name of the role to update.</param>
    /// <param name="policyDocument">The policy document that defines the role.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> PutRolePolicyAsync(string policyName, string roleName, string policyDocument)
    {
        var request = new PutRolePolicyRequest
        {
            PolicyName = policyName,
            RoleName = roleName,
            PolicyDocument = policyDocument
        };

        var response = await _IAMService.PutRolePolicyAsync(request);
        return response.HttpStatusCode == HttpStatusCode.OK;
    }


    /// <summary>
    /// Add or update an inline policy document that is embedded in an IAM user.
    /// </summary>
    /// <param name="userName">The name of the IAM user.</param>
    /// <param name="policyName">The name of the IAM policy.</param>
    /// <param name="policyDocument">The policy document defining the IAM policy.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> PutUserPolicyAsync(string userName, string policyName, string policyDocument)
    {
        var request = new PutUserPolicyRequest
        {
            UserName = userName,
            PolicyName = policyName,
            PolicyDocument = policyDocument
        };

        var response = await _IAMService.PutUserPolicyAsync(request);
        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }

    /// <summary>
    /// Wait for a new access key to be ready to use.
    /// </summary>
    /// <param name="accessKeyId">The Id of the access key.</param>
    /// <returns>A boolean value indicating the success of the action.</returns>
    public async Task<bool> WaitUntilAccessKeyIsReady(string accessKeyId)
    {
        var keyReady = false;

        do
        {
            try
            {
                var response = await _IAMService.GetAccessKeyLastUsedAsync(
                    new GetAccessKeyLastUsedRequest { AccessKeyId = accessKeyId });
                if (response.UserName is not null)
                {
                    keyReady = true;
                }
            }
            catch (NoSuchEntityException)
            {
                keyReady = false;
            }
        } while (!keyReady);

        return keyReady;
    }
}



using Microsoft.Extensions.Configuration;

namespace IAMBasics;

public class IAMBasics
{
    private static ILogger logger = null!;

    static async Task Main(string[] args)
    {
        // Set up dependency injection for the AWS service.
        using var host = Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
                logging.AddFilter("System", LogLevel.Debug)
                    .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information)
                    .AddFilter<ConsoleLoggerProvider>("Microsoft", LogLevel.Trace))
            .ConfigureServices((_, services) =>
            services.AddAWSService<IAmazonIdentityManagementService>()
            .AddTransient<IAMWrapper>()
            .AddTransient<UIWrapper>()
            )
            .Build();

        logger = LoggerFactory.Create(builder => { builder.AddConsole(); })
            .CreateLogger<IAMBasics>();


        IConfiguration configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("settings.json") // Load test settings from .json file.
            .AddJsonFile("settings.local.json",
                true) // Optionally load local settings.
            .Build();

        // Values needed for user, role, and policies.
        string userName = configuration["UserName"]!;
        string s3PolicyName = configuration["S3PolicyName"]!;
        string roleName = configuration["RoleName"]!;


        var iamWrapper = host.Services.GetRequiredService<IAMWrapper>();
        var uiWrapper = host.Services.GetRequiredService<UIWrapper>();

        uiWrapper.DisplayBasicsOverview();
        uiWrapper.PressEnter();

        // First create a user. By default, the new user has
        // no permissions.
        uiWrapper.DisplayTitle("Create User");
        Console.WriteLine($"Creating a new user with user name: {userName}.");
        var user = await iamWrapper.CreateUserAsync(userName);
        var userArn = user.Arn;

        Console.WriteLine($"Successfully created user: {userName} with ARN: {userArn}.");
        uiWrapper.WaitABit(15, "Now let's wait for the user to be ready for use.");

        // Define a role policy document that allows the new user
        // to assume the role.
        string assumeRolePolicyDocument = "{" +
          "\"Version\": \"2012-10-17\"," +
          "\"Statement\": [{" +
              "\"Effect\": \"Allow\"," +
              "\"Principal\": {" +
              $"	\"AWS\": \"{userArn}\"" +
              "}," +
              "\"Action\": \"sts:AssumeRole\"" +
          "}]" +
        "}";

        // Permissions to list all buckets.
        string policyDocument = "{" +
            "\"Version\": \"2012-10-17\"," +
            "	\"Statement\" : [{" +
                "	\"Action\" : [\"s3:ListAllMyBuckets\"]," +
                "	\"Effect\" : \"Allow\"," +
                "	\"Resource\" : \"*\"" +
            "}]" +
        "}";

        // Create an AccessKey for the user.
        uiWrapper.DisplayTitle("Create access key");
        Console.WriteLine("Now let's create an access key for the new user.");
        var accessKey = await iamWrapper.CreateAccessKeyAsync(userName);

        var accessKeyId = accessKey.AccessKeyId;
        var secretAccessKey = accessKey.SecretAccessKey;

        Console.WriteLine($"We have created the access key with Access key id: {accessKeyId}.");

        Console.WriteLine("Now let's wait until the IAM access key is ready to use.");
        var keyReady = await iamWrapper.WaitUntilAccessKeyIsReady(accessKeyId);

        // Now try listing the Amazon Simple Storage Service (Amazon S3)
        // buckets. This should fail at this point because the user doesn't
        // have permissions to perform this task.
        uiWrapper.DisplayTitle("Try to display Amazon S3 buckets");
        Console.WriteLine("Now let's try to display a list of the user's Amazon S3 buckets.");
        var s3Client1 = new AmazonS3Client(accessKeyId, secretAccessKey);
        var stsClient1 = new AmazonSecurityTokenServiceClient(accessKeyId, secretAccessKey);

        var s3Wrapper = new S3Wrapper(s3Client1, stsClient1);
        var buckets = await s3Wrapper.ListMyBucketsAsync();

        Console.WriteLine(buckets is null
            ? "As expected, the call to list the buckets has returned a null list."
            : "Something went wrong. This shouldn't have worked.");

        uiWrapper.PressEnter();

        uiWrapper.DisplayTitle("Create IAM role");
        Console.WriteLine($"Creating the role: {roleName}");

        // Creating an IAM role to allow listing the S3 buckets. A role name
        // is not case sensitive and must be unique to the account for which it
        // is created.
        var roleArn = await iamWrapper.CreateRoleAsync(roleName, assumeRolePolicyDocument);

        uiWrapper.PressEnter();

        // Create a policy with permissions to list S3 buckets.
        uiWrapper.DisplayTitle("Create IAM policy");
        Console.WriteLine($"Creating the policy: {s3PolicyName}");
        Console.WriteLine("with permissions to list the Amazon S3 buckets for the account.");
        var policy = await iamWrapper.CreatePolicyAsync(s3PolicyName, policyDocument);

        // Wait 15 seconds for the IAM policy to be available.
        uiWrapper.WaitABit(15, "Waiting for the policy to be available.");

        // Attach the policy to the role you created earlier.
        uiWrapper.DisplayTitle("Attach new IAM policy");
        Console.WriteLine("Now let's attach the policy to the role.");
        await iamWrapper.AttachRolePolicyAsync(policy.Arn, roleName);

        // Wait 15 seconds for the role to be updated.
        Console.WriteLine();
        uiWrapper.WaitABit(15, "Waiting for the policy to be attached.");

        // Use the AWS Security Token Service (AWS STS) to have the user
        // assume the role we created.
        var stsClient2 = new AmazonSecurityTokenServiceClient(accessKeyId, secretAccessKey);

        // Wait for the new credentials to become valid.
        uiWrapper.WaitABit(10, "Waiting for the credentials to be valid.");

        var assumedRoleCredentials = await s3Wrapper.AssumeS3RoleAsync("temporary-session", roleArn);

        // Try again to list the buckets using the client created with
        // the new user's credentials. This time, it should work.
        var s3Client2 = new AmazonS3Client(assumedRoleCredentials);

        s3Wrapper.UpdateClients(s3Client2, stsClient2);

        buckets = await s3Wrapper.ListMyBucketsAsync();

        uiWrapper.DisplayTitle("List Amazon S3 buckets");
        Console.WriteLine("This time we should have buckets to list.");
        if (buckets is not null)
        {
            buckets.ForEach(bucket =>
            {
                Console.WriteLine($"{bucket.BucketName} created: {bucket.CreationDate}");
            });
        }

        uiWrapper.PressEnter();

        // Now clean up all the resources used in the example.
        uiWrapper.DisplayTitle("Clean up resources");
        Console.WriteLine("Thank you for watching. The IAM Basics demo is complete.");
        Console.WriteLine("Please wait while we clean up the resources we created.");

        await iamWrapper.DetachRolePolicyAsync(policy.Arn, roleName);

        await iamWrapper.DeletePolicyAsync(policy.Arn);

        await iamWrapper.DeleteRoleAsync(roleName);

        await iamWrapper.DeleteAccessKeyAsync(accessKeyId, userName);

        await iamWrapper.DeleteUserAsync(userName);

        uiWrapper.PressEnter();

        Console.WriteLine("All done cleaning up our resources. Thank you for your patience.");
    }
}


namespace IamScenariosCommon;

using System.Net;

/// <summary>
/// A class to perform Amazon Simple Storage Service (Amazon S3) actions for
/// the IAM Basics scenario.
/// </summary>
public class S3Wrapper
{
    private IAmazonS3 _s3Service;
    private IAmazonSecurityTokenService _stsService;

    /// <summary>
    /// Constructor for the S3Wrapper class.
    /// </summary>
    /// <param name="s3Service">An Amazon S3 client object.</param>
    /// <param name="stsService">An AWS Security Token Service (AWS STS)
    /// client object.</param>
    public S3Wrapper(IAmazonS3 s3Service, IAmazonSecurityTokenService stsService)
    {
        _s3Service = s3Service;
        _stsService = stsService;
    }

    /// <summary>
    /// Assumes an AWS Identity and Access Management (IAM) role that allows
    /// Amazon S3 access for the current session.
    /// </summary>
    /// <param name="roleSession">A string representing the current session.</param>
    /// <param name="roleToAssume">The name of the IAM role to assume.</param>
    /// <returns>Credentials for the newly assumed IAM role.</returns>
    public async Task<Credentials> AssumeS3RoleAsync(string roleSession, string roleToAssume)
    {
        // Create the request to use with the AssumeRoleAsync call.
        var request = new AssumeRoleRequest()
        {
            RoleSessionName = roleSession,
            RoleArn = roleToAssume,
        };

        var response = await _stsService.AssumeRoleAsync(request);

        return response.Credentials;
    }


    /// <summary>
    /// Delete an S3 bucket.
    /// </summary>
    /// <param name="bucketName">Name of the S3 bucket to delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteBucketAsync(string bucketName)
    {
        var result = await _s3Service.DeleteBucketAsync(new DeleteBucketRequest { BucketName = bucketName });
        return result.HttpStatusCode == HttpStatusCode.OK;
    }

    /// <summary>
    /// List the buckets that are owned by the user's account.
    /// </summary>
    /// <returns>Async Task.</returns>
    public async Task<List<S3Bucket>?> ListMyBucketsAsync()
    {
        try
        {
            // Get the list of buckets accessible by the new user.
            var response = await _s3Service.ListBucketsAsync();

            return response.Buckets;
        }
        catch (AmazonS3Exception ex)
        {
            // Something else went wrong. Display the error message.
            Console.WriteLine($"Error: {ex.Message}");
            return null;
        }
    }

    /// <summary>
    /// Create a new S3 bucket.
    /// </summary>
    /// <param name="bucketName">The name for the new bucket.</param>
    /// <returns>A Boolean value indicating whether the action completed
    /// successfully.</returns>
    public async Task<bool> PutBucketAsync(string bucketName)
    {
        var response = await _s3Service.PutBucketAsync(new PutBucketRequest { BucketName = bucketName });
        return response.HttpStatusCode == HttpStatusCode.OK;
    }

    /// <summary>
    /// Update the client objects with new client objects. This is available
    /// because the scenario uses the methods of this class without and then
    /// with the proper permissions to list S3 buckets.
    /// </summary>
    /// <param name="s3Service">The Amazon S3 client object.</param>
    /// <param name="stsService">The AWS STS client object.</param>
    public void UpdateClients(IAmazonS3 s3Service, IAmazonSecurityTokenService stsService)
    {
        _s3Service = s3Service;
        _stsService = stsService;
    }
}


namespace IamScenariosCommon;

public class UIWrapper
{
    public readonly string SepBar = new('-', Console.WindowWidth);

    /// <summary>
    /// Show information about the IAM Groups scenario.
    /// </summary>
    public void DisplayGroupsOverview()
    {
        Console.Clear();

        DisplayTitle("Welcome to the IAM Groups Demo");
        Console.WriteLine("This example application does the following:");
        Console.WriteLine("\t1. Creates an Amazon Identity and Access Management (IAM) group.");
        Console.WriteLine("\t2. Adds an IAM policy to the IAM group giving it full access to Amazon S3.");
        Console.WriteLine("\t3. Creates a new IAM user.");
        Console.WriteLine("\t4. Creates an IAM access key for the user.");
        Console.WriteLine("\t5. Adds the user to the IAM group.");
        Console.WriteLine("\t6. Lists the buckets on the account.");
        Console.WriteLine("\t7. Proves that the user has full Amazon S3 access by creating a bucket.");
        Console.WriteLine("\t8. List the buckets again to show the new bucket.");
        Console.WriteLine("\t9. Cleans up all the resources created.");
    }

    /// <summary>
    /// Show information about the IAM Basics scenario.
    /// </summary>
    public void DisplayBasicsOverview()
    {
        Console.Clear();

        DisplayTitle("Welcome to IAM Basics");
        Console.WriteLine("This example application does the following:");
        Console.WriteLine("\t1. Creates a user with no permissions.");
        Console.WriteLine("\t2. Creates a role and policy that grant s3:ListAllMyBuckets permission.");
        Console.WriteLine("\t3. Grants the user permission to assume the role.");
        Console.WriteLine("\t4. Creates an S3 client object as the user and tries to list buckets (this will fail).");
        Console.WriteLine("\t5. Gets temporary credentials by assuming the role.");
        Console.WriteLine("\t6. Creates a new S3 client object with the temporary credentials and lists the buckets (this will succeed).");
        Console.WriteLine("\t7. Deletes all the resources.");
    }

    /// <summary>
    /// Display a message and wait until the user presses enter.
    /// </summary>
    public void PressEnter()
    {
        Console.Write("\nPress <Enter> to continue. ");
        _ = Console.ReadLine();
        Console.WriteLine();
    }

    /// <summary>
    /// Pad a string with spaces to center it on the console display.
    /// </summary>
    /// <param name="strToCenter">The string to be centered.</param>
    /// <returns>The padded string.</returns>
    public string CenterString(string strToCenter)
    {
        var padAmount = (Console.WindowWidth - strToCenter.Length) / 2;
        var leftPad = new string(' ', padAmount);
        return $"{leftPad}{strToCenter}";
    }

    /// <summary>
    /// Display a line of hyphens, the centered text of the title, and another
    /// line of hyphens.
    /// </summary>
    /// <param name="strTitle">The string to be displayed.</param>
    public void DisplayTitle(string strTitle)
    {
        Console.WriteLine(SepBar);
        Console.WriteLine(CenterString(strTitle));
        Console.WriteLine(SepBar);
    }

    /// <summary>
    /// Display a countdown and wait for a number of seconds.
    /// </summary>
    /// <param name="numSeconds">The number of seconds to wait.</param>
    public void WaitABit(int numSeconds, string msg)
    {
        Console.WriteLine(msg);

        // Wait for the requested number of seconds.
        for (int i = numSeconds; i > 0; i--)
        {
            System.Threading.Thread.Sleep(1000);
            Console.Write($"{i}...");
        }

        PressEnter();
    }
}
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK untuk .NET *.
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/PutUserPolicy)

------
#### [ Bash ]

**AWS CLI dengan skrip Bash**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli/bash-linux/iam#code-examples). 

```
###############################################################################
# function iam_create_user_assume_role
#
# Scenario to create an IAM user, create an IAM role, and apply the role to the user.
#
#     "IAM access" permissions are needed to run this code.
#     "STS assume role" permissions are needed to run this code. (Note: It might be necessary to
#           create a custom policy).
#
# Returns:
#       0 - If successful.
#       1 - If an error occurred.
###############################################################################
function iam_create_user_assume_role() {
  {
    if [ "$IAM_OPERATIONS_SOURCED" != "True" ]; then

      source ./iam_operations.sh
    fi
  }

  echo_repeat "*" 88
  echo "Welcome to the IAM create user and assume role demo."
  echo
  echo "This demo will create an IAM user, create an IAM role, and apply the role to the user."
  echo_repeat "*" 88
  echo

  echo -n "Enter a name for a new IAM user: "
  get_input
  user_name=$get_input_result

  local user_arn
  user_arn=$(iam_create_user -u "$user_name")

  # shellcheck disable=SC2181
  if [[ ${?} == 0 ]]; then
    echo "Created demo IAM user named $user_name"
  else
    errecho "$user_arn"
    errecho "The user failed to create. This demo will exit."
    return 1
  fi

  local access_key_response
  access_key_response=$(iam_create_user_access_key -u "$user_name")
  # shellcheck disable=SC2181
  if [[ ${?} != 0 ]]; then
    errecho "The access key failed to create. This demo will exit."
    clean_up "$user_name"
    return 1
  fi

  IFS=$'\t ' read -r -a access_key_values <<<"$access_key_response"
  local key_name=${access_key_values[0]}
  local key_secret=${access_key_values[1]}

  echo "Created access key named $key_name"

  echo "Wait 10 seconds for the user to be ready."
  sleep 10
  echo_repeat "*" 88
  echo

  local iam_role_name
  iam_role_name=$(generate_random_name "test-role")
  echo "Creating a role named $iam_role_name with user $user_name as the principal."

  local assume_role_policy_document="{
    \"Version\": \"2012-10-17\",
    \"Statement\": [{
        \"Effect\": \"Allow\",
        \"Principal\": {\"AWS\": \"$user_arn\"},
        \"Action\": \"sts:AssumeRole\"
        }]
    }"

  local role_arn
  role_arn=$(iam_create_role -n "$iam_role_name" -p "$assume_role_policy_document")

  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    echo "Created IAM role named $iam_role_name"
  else
    errecho "The role failed to create. This demo will exit."
    clean_up "$user_name" "$key_name"
    return 1
  fi

  local policy_name
  policy_name=$(generate_random_name "test-policy")
  local policy_document="{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"s3:ListAllMyBuckets\",
                    \"Resource\": \"arn:aws:s3:::*\"}]}"

  local policy_arn
  policy_arn=$(iam_create_policy -n "$policy_name" -p "$policy_document")
  # shellcheck disable=SC2181
  if [[ ${?} == 0 ]]; then
    echo "Created  IAM policy named $policy_name"
  else
    errecho "The policy failed to create."
    clean_up "$user_name" "$key_name" "$iam_role_name"
    return 1
  fi

  if (iam_attach_role_policy -n "$iam_role_name" -p "$policy_arn"); then
    echo "Attached policy $policy_arn to role $iam_role_name"
  else
    errecho "The policy failed to attach."
    clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn"
    return 1
  fi

  local assume_role_policy_document="{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"sts:AssumeRole\",
                    \"Resource\": \"$role_arn\"}]}"

  local assume_role_policy_name
  assume_role_policy_name=$(generate_random_name "test-assume-role-")

  # shellcheck disable=SC2181
  local assume_role_policy_arn
  assume_role_policy_arn=$(iam_create_policy -n "$assume_role_policy_name" -p "$assume_role_policy_document")
  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    echo "Created  IAM policy named $assume_role_policy_name for sts assume role"
  else
    errecho "The policy failed to create."
    clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn" "$policy_arn"
    return 1
  fi

  echo "Wait 10 seconds to give AWS time to propagate these new resources and connections."
  sleep 10
  echo_repeat "*" 88
  echo

  echo "Try to list buckets without the new user assuming the role."
  echo_repeat "*" 88
  echo

  # Set the environment variables for the created user.
  # bashsupport disable=BP2001
  export AWS_ACCESS_KEY_ID=$key_name
  # bashsupport disable=BP2001
  export AWS_SECRET_ACCESS_KEY=$key_secret

  local buckets
  buckets=$(s3_list_buckets)

  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    local bucket_count
    bucket_count=$(echo "$buckets" | wc -w | xargs)
    echo "There are $bucket_count buckets in the account. This should not have happened."
  else
    errecho "Because the role with permissions has not been assumed, listing buckets failed."
  fi

  echo
  echo_repeat "*" 88
  echo "Now assume the role $iam_role_name and list the buckets."
  echo_repeat "*" 88
  echo

  local credentials

  credentials=$(sts_assume_role -r "$role_arn" -n "AssumeRoleDemoSession")
  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    echo "Assumed role $iam_role_name"
  else
    errecho "Failed to assume role."
    export AWS_ACCESS_KEY_ID=""
    export AWS_SECRET_ACCESS_KEY=""
    clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn" "$policy_arn" "$assume_role_policy_arn"
    return 1
  fi

  IFS=$'\t ' read -r -a credentials <<<"$credentials"

  export AWS_ACCESS_KEY_ID=${credentials[0]}
  export AWS_SECRET_ACCESS_KEY=${credentials[1]}
  # bashsupport disable=BP2001
  export AWS_SESSION_TOKEN=${credentials[2]}

  buckets=$(s3_list_buckets)

  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    local bucket_count
    bucket_count=$(echo "$buckets" | wc -w | xargs)
    echo "There are $bucket_count buckets in the account. Listing buckets succeeded because of "
    echo "the assumed role."
  else
    errecho "Failed to list buckets. This should not happen."
    export AWS_ACCESS_KEY_ID=""
    export AWS_SECRET_ACCESS_KEY=""
    export AWS_SESSION_TOKEN=""
    clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn" "$policy_arn" "$assume_role_policy_arn"
    return 1
  fi

  local result=0
  export AWS_ACCESS_KEY_ID=""
  export AWS_SECRET_ACCESS_KEY=""

  echo
  echo_repeat "*" 88
  echo "The created resources will now be deleted."
  echo_repeat "*" 88
  echo

  clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn" "$policy_arn" "$assume_role_policy_arn"

  # shellcheck disable=SC2181
  if [[ ${?} -ne 0 ]]; then
    result=1
  fi

  return $result
}
```
Fungsi IAM yang digunakan dalam skenario ini.  

```
###############################################################################
# function iam_user_exists
#
# This function checks to see if the specified AWS Identity and Access Management (IAM) user already exists.
#
# Parameters:
#       $1 - The name of the IAM user to check.
#
# Returns:
#       0 - If the user already exists.
#       1 - If the user doesn't exist.
###############################################################################
function iam_user_exists() {
  local user_name
  user_name=$1

  # Check whether the IAM user already exists.
  # We suppress all output - we're interested only in the return code.

  local errors
  errors=$(aws iam get-user \
    --user-name "$user_name" 2>&1 >/dev/null)

  local error_code=${?}

  if [[ $error_code -eq 0 ]]; then
    return 0 # 0 in Bash script means true.
  else
    if [[ $errors != *"error"*"(NoSuchEntity)"* ]]; then
      aws_cli_error_log $error_code
      errecho "Error calling iam get-user $errors"
    fi

    return 1 # 1 in Bash script means false.
  fi
}

###############################################################################
# function iam_create_user
#
# This function creates the specified IAM user, unless
# it already exists.
#
# Parameters:
#       -u user_name  -- The name of the user to create.
#
# Returns:
#       The ARN of the user.
#     And:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_create_user() {
  local user_name response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_create_user"
    echo "Creates an AWS Identity and Access Management (IAM) user. You must supply a username:"
    echo "  -u user_name    The name of the user. It must be unique within the account."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "u:h" option; do
    case "${option}" in
      u) user_name="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$user_name" ]]; then
    errecho "ERROR: You must provide a username with the -u parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    User name:   $user_name"
  iecho ""

  # If the user already exists, we don't want to try to create it.
  if (iam_user_exists "$user_name"); then
    errecho "ERROR: A user with that name already exists in the account."
    return 1
  fi

  response=$(aws iam create-user --user-name "$user_name" \
    --output text \
    --query 'User.Arn')

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-user operation failed.$response"
    return 1
  fi

  echo "$response"

  return 0
}

###############################################################################
# function iam_create_user_access_key
#
# This function creates an IAM access key for the specified user.
#
# Parameters:
#       -u user_name -- The name of the IAM user.
#       [-f file_name] -- The optional file name for the access key output.
#
# Returns:
#       [access_key_id access_key_secret]
#     And:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_create_user_access_key() {
  local user_name file_name response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_create_user_access_key"
    echo "Creates an AWS Identity and Access Management (IAM) key pair."
    echo "  -u user_name   The name of the IAM user."
    echo "  [-f file_name]   Optional file name for the access key output."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "u:f:h" option; do
    case "${option}" in
      u) user_name="${OPTARG}" ;;
      f) file_name="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$user_name" ]]; then
    errecho "ERROR: You must provide a username with the -u parameter."
    usage
    return 1
  fi

  response=$(aws iam create-access-key \
    --user-name "$user_name" \
    --output text)

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-access-key operation failed.$response"
    return 1
  fi

  if [[ -n "$file_name" ]]; then
    echo "$response" >"$file_name"
  fi

  local key_id key_secret
  # shellcheck disable=SC2086
  key_id=$(echo $response | cut -f 2 -d ' ')
  # shellcheck disable=SC2086
  key_secret=$(echo $response | cut -f 4 -d ' ')

  echo "$key_id $key_secret"

  return 0
}

###############################################################################
# function iam_create_role
#
# This function creates an IAM role.
#
# Parameters:
#       -n role_name -- The name of the IAM role.
#       -p policy_json -- The assume role policy document.
#
# Returns:
#       The ARN of the role.
#     And:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_create_role() {
  local role_name policy_document response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_create_user_access_key"
    echo "Creates an AWS Identity and Access Management (IAM) role."
    echo "  -n role_name   The name of the IAM role."
    echo "  -p policy_json -- The assume role policy document."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:p:h" option; do
    case "${option}" in
      n) role_name="${OPTARG}" ;;
      p) policy_document="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$role_name" ]]; then
    errecho "ERROR: You must provide a role name with the -n parameter."
    usage
    return 1
  fi

  if [[ -z "$policy_document" ]]; then
    errecho "ERROR: You must provide a policy document with the -p parameter."
    usage
    return 1
  fi

  response=$(aws iam create-role \
    --role-name "$role_name" \
    --assume-role-policy-document "$policy_document" \
    --output text \
    --query Role.Arn)

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-role operation failed.\n$response"
    return 1
  fi

  echo "$response"

  return 0
}

###############################################################################
# function iam_create_policy
#
# This function creates an IAM policy.
#
# Parameters:
#       -n policy_name -- The name of the IAM policy.
#       -p policy_json -- The policy document.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_create_policy() {
  local policy_name policy_document response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_create_policy"
    echo "Creates an AWS Identity and Access Management (IAM) policy."
    echo "  -n policy_name   The name of the IAM policy."
    echo "  -p policy_json -- The policy document."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:p:h" option; do
    case "${option}" in
      n) policy_name="${OPTARG}" ;;
      p) policy_document="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$policy_name" ]]; then
    errecho "ERROR: You must provide a policy name with the -n parameter."
    usage
    return 1
  fi

  if [[ -z "$policy_document" ]]; then
    errecho "ERROR: You must provide a policy document with the -p parameter."
    usage
    return 1
  fi

  response=$(aws iam create-policy \
    --policy-name "$policy_name" \
    --policy-document "$policy_document" \
    --output text \
    --query Policy.Arn)

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-policy operation failed.\n$response"
    return 1
  fi

  echo "$response"
}

###############################################################################
# function iam_attach_role_policy
#
# This function attaches an IAM policy to a tole.
#
# Parameters:
#       -n role_name -- The name of the IAM role.
#       -p policy_ARN -- The IAM policy document ARN..
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_attach_role_policy() {
  local role_name policy_arn response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_attach_role_policy"
    echo "Attaches an AWS Identity and Access Management (IAM) policy to an IAM role."
    echo "  -n role_name   The name of the IAM role."
    echo "  -p policy_ARN -- The IAM policy document ARN."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:p:h" option; do
    case "${option}" in
      n) role_name="${OPTARG}" ;;
      p) policy_arn="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$role_name" ]]; then
    errecho "ERROR: You must provide a role name with the -n parameter."
    usage
    return 1
  fi

  if [[ -z "$policy_arn" ]]; then
    errecho "ERROR: You must provide a policy ARN with the -p parameter."
    usage
    return 1
  fi

  response=$(aws iam attach-role-policy \
    --role-name "$role_name" \
    --policy-arn "$policy_arn")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports attach-role-policy operation failed.\n$response"
    return 1
  fi

  echo "$response"

  return 0
}

###############################################################################
# function iam_detach_role_policy
#
# This function detaches an IAM policy to a tole.
#
# Parameters:
#       -n role_name -- The name of the IAM role.
#       -p policy_ARN -- The IAM policy document ARN..
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_detach_role_policy() {
  local role_name policy_arn response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_detach_role_policy"
    echo "Detaches an AWS Identity and Access Management (IAM) policy to an IAM role."
    echo "  -n role_name   The name of the IAM role."
    echo "  -p policy_ARN -- The IAM policy document ARN."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:p:h" option; do
    case "${option}" in
      n) role_name="${OPTARG}" ;;
      p) policy_arn="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$role_name" ]]; then
    errecho "ERROR: You must provide a role name with the -n parameter."
    usage
    return 1
  fi

  if [[ -z "$policy_arn" ]]; then
    errecho "ERROR: You must provide a policy ARN with the -p parameter."
    usage
    return 1
  fi

  response=$(aws iam detach-role-policy \
    --role-name "$role_name" \
    --policy-arn "$policy_arn")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports detach-role-policy operation failed.\n$response"
    return 1
  fi

  echo "$response"

  return 0
}

###############################################################################
# function iam_delete_policy
#
# This function deletes an IAM policy.
#
# Parameters:
#       -n policy_arn -- The name of the IAM policy arn.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_delete_policy() {
  local policy_arn response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_delete_policy"
    echo "Deletes an AWS Identity and Access Management (IAM) policy"
    echo "  -n policy_arn -- The name of the IAM policy arn."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:h" option; do
    case "${option}" in
      n) policy_arn="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$policy_arn" ]]; then
    errecho "ERROR: You must provide a policy arn with the -n parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    Policy arn:  $policy_arn"
  iecho ""

  response=$(aws iam delete-policy \
    --policy-arn "$policy_arn")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports delete-policy operation failed.\n$response"
    return 1
  fi

  iecho "delete-policy response:$response"
  iecho

  return 0
}

###############################################################################
# function iam_delete_role
#
# This function deletes an IAM role.
#
# Parameters:
#       -n role_name -- The name of the IAM role.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_delete_role() {
  local role_name response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_delete_role"
    echo "Deletes an AWS Identity and Access Management (IAM) role"
    echo "  -n role_name -- The name of the IAM role."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:h" option; do
    case "${option}" in
      n) role_name="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  echo "role_name:$role_name"
  if [[ -z "$role_name" ]]; then
    errecho "ERROR: You must provide a role name with the -n parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    Role name:  $role_name"
  iecho ""

  response=$(aws iam delete-role \
    --role-name "$role_name")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports delete-role operation failed.\n$response"
    return 1
  fi

  iecho "delete-role response:$response"
  iecho

  return 0
}

###############################################################################
# function iam_delete_access_key
#
# This function deletes an IAM access key for the specified IAM user.
#
# Parameters:
#       -u user_name  -- The name of the user.
#       -k access_key -- The access key to delete.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_delete_access_key() {
  local user_name access_key response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_delete_access_key"
    echo "Deletes an AWS Identity and Access Management (IAM) access key for the specified IAM user"
    echo "  -u user_name    The name of the user."
    echo "  -k access_key   The access key to delete."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "u:k:h" option; do
    case "${option}" in
      u) user_name="${OPTARG}" ;;
      k) access_key="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$user_name" ]]; then
    errecho "ERROR: You must provide a username with the -u parameter."
    usage
    return 1
  fi

  if [[ -z "$access_key" ]]; then
    errecho "ERROR: You must provide an access key with the -k parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    Username:   $user_name"
  iecho "    Access key:   $access_key"
  iecho ""

  response=$(aws iam delete-access-key \
    --user-name "$user_name" \
    --access-key-id "$access_key")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports delete-access-key operation failed.\n$response"
    return 1
  fi

  iecho "delete-access-key response:$response"
  iecho

  return 0
}

###############################################################################
# function iam_delete_user
#
# This function deletes the specified IAM user.
#
# Parameters:
#       -u user_name  -- The name of the user to create.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_delete_user() {
  local user_name response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_delete_user"
    echo "Deletes an AWS Identity and Access Management (IAM) user. You must supply a username:"
    echo "  -u user_name    The name of the user."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "u:h" option; do
    case "${option}" in
      u) user_name="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$user_name" ]]; then
    errecho "ERROR: You must provide a username with the -u parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    User name:   $user_name"
  iecho ""

  # If the user does not exist, we don't want to try to delete it.
  if (! iam_user_exists "$user_name"); then
    errecho "ERROR: A user with that name does not exist in the account."
    return 1
  fi

  response=$(aws iam delete-user \
    --user-name "$user_name")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports delete-user operation failed.$response"
    return 1
  fi

  iecho "delete-user response:$response"
  iecho

  return 0
}
```
+ Untuk detail API, lihat topik berikut di *Referensi Perintah AWS CLI *.
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/PutUserPolicy)

------
#### [ C\$1\$1 ]

**SDK untuk C\$1\$1**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkap dan pelajari cara menyiapkan dan menjalankan di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/iam#code-examples). 

```
namespace AwsDoc {
    namespace IAM {
  
        //! Cleanup by deleting created entities.
        /*!
          \sa DeleteCreatedEntities
          \param client: IAM client.
          \param role: IAM role.
          \param user: IAM user.
          \param policy: IAM policy.
        */
        static bool DeleteCreatedEntities(const Aws::IAM::IAMClient &client,
                                          const Aws::IAM::Model::Role &role,
                                          const Aws::IAM::Model::User &user,
                                          const Aws::IAM::Model::Policy &policy);
    }

    static const int LIST_BUCKETS_WAIT_SEC = 20;

    static const char ALLOCATION_TAG[] = "example_code";
}

//! Scenario to create an IAM user, create an IAM role, and apply the role to the user.
// "IAM access" permissions are needed to run this code.
// "STS assume role" permissions are needed to run this code. (Note: It might be necessary to
//    create a custom policy).
/*!
  \sa iamCreateUserAssumeRoleScenario
  \param clientConfig: Aws client configuration.
  \return bool: Successful completion.
*/
bool AwsDoc::IAM::iamCreateUserAssumeRoleScenario(
        const Aws::Client::ClientConfiguration &clientConfig) {

    Aws::IAM::IAMClient client(clientConfig);
    Aws::IAM::Model::User user;
    Aws::IAM::Model::Role role;
    Aws::IAM::Model::Policy policy;

    // 1. Create a user.
    {
        Aws::IAM::Model::CreateUserRequest request;
        Aws::String uuid = Aws::Utils::UUID::RandomUUID();
        Aws::String userName = "iam-demo-user-" +
                               Aws::Utils::StringUtils::ToLower(uuid.c_str());
        request.SetUserName(userName);

        Aws::IAM::Model::CreateUserOutcome outcome = client.CreateUser(request);
        if (!outcome.IsSuccess()) {
            std::cout << "Error creating IAM user " << userName << ":" <<
                      outcome.GetError().GetMessage() << std::endl;
            return false;
        }
        else {
            std::cout << "Successfully created IAM user " << userName << std::endl;
        }

        user = outcome.GetResult().GetUser();
    }

    // 2. Create a role.
    {
        // Get the IAM user for the current client in order to access its ARN.
        Aws::String iamUserArn;
        {
            Aws::IAM::Model::GetUserRequest request;
            Aws::IAM::Model::GetUserOutcome outcome = client.GetUser(request);
            if (!outcome.IsSuccess()) {
                std::cerr << "Error getting Iam user. " <<
                          outcome.GetError().GetMessage() << std::endl;

                DeleteCreatedEntities(client, role, user, policy);
                return false;
            }
            else {
                std::cout << "Successfully retrieved Iam user "
                          << outcome.GetResult().GetUser().GetUserName()
                          << std::endl;
            }

            iamUserArn = outcome.GetResult().GetUser().GetArn();
        }

        Aws::IAM::Model::CreateRoleRequest request;

        Aws::String uuid = Aws::Utils::UUID::RandomUUID();
        Aws::String roleName = "iam-demo-role-" +
                               Aws::Utils::StringUtils::ToLower(uuid.c_str());
        request.SetRoleName(roleName);

        // Build policy document for role.
        Aws::Utils::Document jsonStatement;
        jsonStatement.WithString("Effect", "Allow");

        Aws::Utils::Document jsonPrincipal;
        jsonPrincipal.WithString("AWS", iamUserArn);
        jsonStatement.WithObject("Principal", jsonPrincipal);
        jsonStatement.WithString("Action", "sts:AssumeRole");
        jsonStatement.WithObject("Condition", Aws::Utils::Document());

        Aws::Utils::Document policyDocument;
        policyDocument.WithString("Version", "2012-10-17");

        Aws::Utils::Array<Aws::Utils::Document> statements(1);
        statements[0] = jsonStatement;
        policyDocument.WithArray("Statement", statements);

        std::cout << "Setting policy for role\n   "
                  << policyDocument.View().WriteCompact() << std::endl;

        // Set role policy document as JSON string.
        request.SetAssumeRolePolicyDocument(policyDocument.View().WriteCompact());

        Aws::IAM::Model::CreateRoleOutcome outcome = client.CreateRole(request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error creating role. " <<
                      outcome.GetError().GetMessage() << std::endl;

            DeleteCreatedEntities(client, role, user, policy);
            return false;
        }
        else {
            std::cout << "Successfully created a role with name " << roleName
                      << std::endl;
        }

        role = outcome.GetResult().GetRole();
    }

    // 3. Create an IAM policy.
    {
        Aws::IAM::Model::CreatePolicyRequest request;
        Aws::String uuid = Aws::Utils::UUID::RandomUUID();
        Aws::String policyName = "iam-demo-policy-" +
                                 Aws::Utils::StringUtils::ToLower(uuid.c_str());
        request.SetPolicyName(policyName);

        // Build IAM policy document.
        Aws::Utils::Document jsonStatement;
        jsonStatement.WithString("Effect", "Allow");
        jsonStatement.WithString("Action", "s3:ListAllMyBuckets");
        jsonStatement.WithString("Resource", "arn:aws:s3:::*");

        Aws::Utils::Document policyDocument;
        policyDocument.WithString("Version", "2012-10-17");

        Aws::Utils::Array<Aws::Utils::Document> statements(1);
        statements[0] = jsonStatement;
        policyDocument.WithArray("Statement", statements);

        std::cout << "Creating a policy.\n   " << policyDocument.View().WriteCompact()
                  << std::endl;

        // Set IAM policy document as JSON string.
        request.SetPolicyDocument(policyDocument.View().WriteCompact());

        Aws::IAM::Model::CreatePolicyOutcome outcome = client.CreatePolicy(request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error creating policy. " <<
                      outcome.GetError().GetMessage() << std::endl;

            DeleteCreatedEntities(client, role, user, policy);
            return false;
        }
        else {
            std::cout << "Successfully created a policy with name, " << policyName <<
                      "." << std::endl;
        }

        policy = outcome.GetResult().GetPolicy();
    }

    // 4. Assume the new role using the AWS Security Token Service (STS).
    Aws::STS::Model::Credentials credentials;
    {
        Aws::STS::STSClient stsClient(clientConfig);

        Aws::STS::Model::AssumeRoleRequest request;
        request.SetRoleArn(role.GetArn());
        Aws::String uuid = Aws::Utils::UUID::RandomUUID();
        Aws::String roleSessionName = "iam-demo-role-session-" +
                                      Aws::Utils::StringUtils::ToLower(uuid.c_str());
        request.SetRoleSessionName(roleSessionName);

        Aws::STS::Model::AssumeRoleOutcome assumeRoleOutcome;

        // Repeatedly call AssumeRole, because there is often a delay
        // before the role is available to be assumed.
        // Repeat at most 20 times when access is denied.
        int count = 0;
        while (true) {
            assumeRoleOutcome = stsClient.AssumeRole(request);
            if (!assumeRoleOutcome.IsSuccess()) {
                if (count > 20 ||
                    assumeRoleOutcome.GetError().GetErrorType() !=
                    Aws::STS::STSErrors::ACCESS_DENIED) {
                    std::cerr << "Error assuming role after 20 tries. " <<
                              assumeRoleOutcome.GetError().GetMessage() << std::endl;

                    DeleteCreatedEntities(client, role, user, policy);
                    return false;
                }
                std::this_thread::sleep_for(std::chrono::seconds(1));
            }
            else {
                std::cout << "Successfully assumed the role after " << count
                          << " seconds." << std::endl;
                break;
            }
            count++;
        }

        credentials = assumeRoleOutcome.GetResult().GetCredentials();
    }


    // 5. List objects in the bucket (This should fail).
    {
        Aws::S3::S3Client s3Client(
                Aws::Auth::AWSCredentials(credentials.GetAccessKeyId(),
                                          credentials.GetSecretAccessKey(),
                                          credentials.GetSessionToken()),
                Aws::MakeShared<Aws::S3::S3EndpointProvider>(ALLOCATION_TAG),
                clientConfig);
        Aws::S3::Model::ListBucketsOutcome listBucketsOutcome = s3Client.ListBuckets();
        if (!listBucketsOutcome.IsSuccess()) {
            if (listBucketsOutcome.GetError().GetErrorType() !=
                Aws::S3::S3Errors::ACCESS_DENIED) {
                std::cerr << "Could not lists buckets. " <<
                          listBucketsOutcome.GetError().GetMessage() << std::endl;
            }
            else {
                std::cout
                        << "Access to list buckets denied because privileges have not been applied."
                        << std::endl;
            }
        }
        else {
            std::cerr
                    << "Successfully retrieved bucket lists when this should not happen."
                    << std::endl;
        }
    }

    // 6. Attach the policy to the role.
    {
        Aws::IAM::Model::AttachRolePolicyRequest request;
        request.SetRoleName(role.GetRoleName());
        request.WithPolicyArn(policy.GetArn());

        Aws::IAM::Model::AttachRolePolicyOutcome outcome = client.AttachRolePolicy(
                request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error creating policy. " <<
                      outcome.GetError().GetMessage() << std::endl;

            DeleteCreatedEntities(client, role, user, policy);
            return false;
        }
        else {
            std::cout << "Successfully attached the policy with name, "
                      << policy.GetPolicyName() <<
                      ", to the role, " << role.GetRoleName() << "." << std::endl;
        }
    }

    int count = 0;
    // 7. List objects in the bucket (this should succeed).
    // Repeatedly call ListBuckets, because there is often a delay
    // before the policy with ListBucket permissions has been applied to the role.
    // Repeat at most LIST_BUCKETS_WAIT_SEC times when access is denied.
    while (true) {
        Aws::S3::S3Client s3Client(
                Aws::Auth::AWSCredentials(credentials.GetAccessKeyId(),
                                          credentials.GetSecretAccessKey(),
                                          credentials.GetSessionToken()),
                Aws::MakeShared<Aws::S3::S3EndpointProvider>(ALLOCATION_TAG),
                clientConfig);
        Aws::S3::Model::ListBucketsOutcome listBucketsOutcome = s3Client.ListBuckets();
        if (!listBucketsOutcome.IsSuccess()) {
            if ((count > LIST_BUCKETS_WAIT_SEC) ||
                listBucketsOutcome.GetError().GetErrorType() !=
                Aws::S3::S3Errors::ACCESS_DENIED) {
                std::cerr << "Could not lists buckets after " << LIST_BUCKETS_WAIT_SEC << " seconds. " <<
                          listBucketsOutcome.GetError().GetMessage() << std::endl;
                DeleteCreatedEntities(client, role, user, policy);
                return false;
            }

            std::this_thread::sleep_for(std::chrono::seconds(1));
        }
        else {

            std::cout << "Successfully retrieved bucket lists after " << count
                      << " seconds." << std::endl;
            break;
        }
        count++;
    }

    // 8. Delete all the created resources.
    return DeleteCreatedEntities(client, role, user, policy);
}

bool AwsDoc::IAM::DeleteCreatedEntities(const Aws::IAM::IAMClient &client,
                                        const Aws::IAM::Model::Role &role,
                                        const Aws::IAM::Model::User &user,
                                        const Aws::IAM::Model::Policy &policy) {
    bool result = true;
    if (policy.ArnHasBeenSet()) {
        // Detach the policy from the role.
        {
            Aws::IAM::Model::DetachRolePolicyRequest request;
            request.SetPolicyArn(policy.GetArn());
            request.SetRoleName(role.GetRoleName());

            Aws::IAM::Model::DetachRolePolicyOutcome outcome = client.DetachRolePolicy(
                    request);
            if (!outcome.IsSuccess()) {
                std::cerr << "Error Detaching policy from roles. " <<
                          outcome.GetError().GetMessage() << std::endl;
                result = false;
            }
            else {
                std::cout << "Successfully detached the policy with arn "
                          << policy.GetArn()
                          << " from role " << role.GetRoleName() << "." << std::endl;
            }
        }

        // Delete the policy.
        {
            Aws::IAM::Model::DeletePolicyRequest request;
            request.WithPolicyArn(policy.GetArn());

            Aws::IAM::Model::DeletePolicyOutcome outcome = client.DeletePolicy(request);
            if (!outcome.IsSuccess()) {
                std::cerr << "Error deleting policy. " <<
                          outcome.GetError().GetMessage() << std::endl;
                result = false;
            }
            else {
                std::cout << "Successfully deleted the policy with arn "
                          << policy.GetArn() << std::endl;
            }
        }

    }

    if (role.RoleIdHasBeenSet()) {
        // Delete the role.
        Aws::IAM::Model::DeleteRoleRequest request;
        request.SetRoleName(role.GetRoleName());

        Aws::IAM::Model::DeleteRoleOutcome outcome = client.DeleteRole(request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error deleting role. " <<
                      outcome.GetError().GetMessage() << std::endl;
            result = false;
        }
        else {
            std::cout << "Successfully deleted the role with name "
                      << role.GetRoleName() << std::endl;
        }
    }

    if (user.ArnHasBeenSet()) {
        // Delete the user.
        Aws::IAM::Model::DeleteUserRequest request;
        request.WithUserName(user.GetUserName());

        Aws::IAM::Model::DeleteUserOutcome outcome = client.DeleteUser(request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error deleting user. " <<
                      outcome.GetError().GetMessage() << std::endl;
            result = false;
        }
        else {
            std::cout << "Successfully deleted the user with name "
                      << user.GetUserName() << std::endl;
        }
    }

    return result;
}
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK untuk C\$1\$1 *.
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/PutUserPolicy)

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkap dan pelajari cara menyiapkan dan menjalankan di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/gov2/iam#code-examples). 
Jalankan skenario interaktif di penggugah/prompt perintah.  

```
import (
	"context"
	"errors"
	"fmt"
	"log"
	"math/rand"
	"strings"
	"time"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/credentials"
	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/aws/aws-sdk-go-v2/service/sts"
	"github.com/aws/smithy-go"
	"github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools"
	"github.com/awsdocs/aws-doc-sdk-examples/gov2/iam/actions"
)

// AssumeRoleScenario shows you how to use the AWS Identity and Access Management (IAM)
// service to perform the following actions:
//
//  1. Create a user who has no permissions.
//  2. Create a role that grants permission to list Amazon Simple Storage Service
//     (Amazon S3) buckets for the account.
//  3. Add a policy to let the user assume the role.
//  4. Try and fail to list buckets without permissions.
//  5. Assume the role and list S3 buckets using temporary credentials.
//  6. Delete the policy, role, and user.
type AssumeRoleScenario struct {
	sdkConfig      aws.Config
	accountWrapper actions.AccountWrapper
	policyWrapper  actions.PolicyWrapper
	roleWrapper    actions.RoleWrapper
	userWrapper    actions.UserWrapper
	questioner     demotools.IQuestioner
	helper         IScenarioHelper
	isTestRun      bool
}

// NewAssumeRoleScenario constructs an AssumeRoleScenario instance from a configuration.
// It uses the specified config to get an IAM client and create wrappers for the actions
// used in the scenario.
func NewAssumeRoleScenario(sdkConfig aws.Config, questioner demotools.IQuestioner,
	helper IScenarioHelper) AssumeRoleScenario {
	iamClient := iam.NewFromConfig(sdkConfig)
	return AssumeRoleScenario{
		sdkConfig:      sdkConfig,
		accountWrapper: actions.AccountWrapper{IamClient: iamClient},
		policyWrapper:  actions.PolicyWrapper{IamClient: iamClient},
		roleWrapper:    actions.RoleWrapper{IamClient: iamClient},
		userWrapper:    actions.UserWrapper{IamClient: iamClient},
		questioner:     questioner,
		helper:         helper,
	}
}

// addTestOptions appends the API options specified in the original configuration to
// another configuration. This is used to attach the middleware stubber to clients
// that are constructed during the scenario, which is needed for unit testing.
func (scenario AssumeRoleScenario) addTestOptions(scenarioConfig *aws.Config) {
	if scenario.isTestRun {
		scenarioConfig.APIOptions = append(scenarioConfig.APIOptions, scenario.sdkConfig.APIOptions...)
	}
}

// Run runs the interactive scenario.
func (scenario AssumeRoleScenario) Run(ctx context.Context) {
	defer func() {
		if r := recover(); r != nil {
			log.Printf("Something went wrong with the demo.\n")
			log.Println(r)
		}
	}()

	log.Println(strings.Repeat("-", 88))
	log.Println("Welcome to the AWS Identity and Access Management (IAM) assume role demo.")
	log.Println(strings.Repeat("-", 88))

	user := scenario.CreateUser(ctx)
	accessKey := scenario.CreateAccessKey(ctx, user)
	role := scenario.CreateRoleAndPolicies(ctx, user)
	noPermsConfig := scenario.ListBucketsWithoutPermissions(ctx, accessKey)
	scenario.ListBucketsWithAssumedRole(ctx, noPermsConfig, role)
	scenario.Cleanup(ctx, user, role)

	log.Println(strings.Repeat("-", 88))
	log.Println("Thanks for watching!")
	log.Println(strings.Repeat("-", 88))
}

// CreateUser creates a new IAM user. This user has no permissions.
func (scenario AssumeRoleScenario) CreateUser(ctx context.Context) *types.User {
	log.Println("Let's create an example user with no permissions.")
	userName := scenario.questioner.Ask("Enter a name for the example user:", demotools.NotEmpty{})
	user, err := scenario.userWrapper.GetUser(ctx, userName)
	if err != nil {
		panic(err)
	}
	if user == nil {
		user, err = scenario.userWrapper.CreateUser(ctx, userName)
		if err != nil {
			panic(err)
		}
		log.Printf("Created user %v.\n", *user.UserName)
	} else {
		log.Printf("User %v already exists.\n", *user.UserName)
	}
	log.Println(strings.Repeat("-", 88))
	return user
}

// CreateAccessKey creates an access key for the user.
func (scenario AssumeRoleScenario) CreateAccessKey(ctx context.Context, user *types.User) *types.AccessKey {
	accessKey, err := scenario.userWrapper.CreateAccessKeyPair(ctx, *user.UserName)
	if err != nil {
		panic(err)
	}
	log.Printf("Created access key %v for your user.", *accessKey.AccessKeyId)
	log.Println("Waiting a few seconds for your user to be ready...")
	scenario.helper.Pause(10)
	log.Println(strings.Repeat("-", 88))
	return accessKey
}

// CreateRoleAndPolicies creates a policy that grants permission to list S3 buckets for
// the current account and attaches the policy to a newly created role. It also adds an
// inline policy to the specified user that grants the user permission to assume the role.
func (scenario AssumeRoleScenario) CreateRoleAndPolicies(ctx context.Context, user *types.User) *types.Role {
	log.Println("Let's create a role and policy that grant permission to list S3 buckets.")
	scenario.questioner.Ask("Press Enter when you're ready.")
	listBucketsRole, err := scenario.roleWrapper.CreateRole(ctx, scenario.helper.GetName(), *user.Arn)
	if err != nil {
		panic(err)
	}
	log.Printf("Created role %v.\n", *listBucketsRole.RoleName)
	listBucketsPolicy, err := scenario.policyWrapper.CreatePolicy(
		ctx, scenario.helper.GetName(), []string{"s3:ListAllMyBuckets"}, "arn:aws:s3:::*")
	if err != nil {
		panic(err)
	}
	log.Printf("Created policy %v.\n", *listBucketsPolicy.PolicyName)
	err = scenario.roleWrapper.AttachRolePolicy(ctx, *listBucketsPolicy.Arn, *listBucketsRole.RoleName)
	if err != nil {
		panic(err)
	}
	log.Printf("Attached policy %v to role %v.\n", *listBucketsPolicy.PolicyName,
		*listBucketsRole.RoleName)
	err = scenario.userWrapper.CreateUserPolicy(ctx, *user.UserName, scenario.helper.GetName(),
		[]string{"sts:AssumeRole"}, *listBucketsRole.Arn)
	if err != nil {
		panic(err)
	}
	log.Printf("Created an inline policy for user %v that lets the user assume the role.\n",
		*user.UserName)
	log.Println("Let's give AWS a few seconds to propagate these new resources and connections...")
	scenario.helper.Pause(10)
	log.Println(strings.Repeat("-", 88))
	return listBucketsRole
}

// ListBucketsWithoutPermissions creates an Amazon S3 client from the user's access key
// credentials and tries to list buckets for the account. Because the user does not have
// permission to perform this action, the action fails.
func (scenario AssumeRoleScenario) ListBucketsWithoutPermissions(ctx context.Context, accessKey *types.AccessKey) *aws.Config {
	log.Println("Let's try to list buckets without permissions. This should return an AccessDenied error.")
	scenario.questioner.Ask("Press Enter when you're ready.")
	noPermsConfig, err := config.LoadDefaultConfig(ctx,
		config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
			*accessKey.AccessKeyId, *accessKey.SecretAccessKey, ""),
		))
	if err != nil {
		panic(err)
	}

	// Add test options if this is a test run. This is needed only for testing purposes.
	scenario.addTestOptions(&noPermsConfig)

	s3Client := s3.NewFromConfig(noPermsConfig)
	_, err = s3Client.ListBuckets(ctx, &s3.ListBucketsInput{})
	if err != nil {
		// The SDK for Go does not model the AccessDenied error, so check ErrorCode directly.
		var ae smithy.APIError
		if errors.As(err, &ae) {
			switch ae.ErrorCode() {
			case "AccessDenied":
				log.Println("Got AccessDenied error, which is the expected result because\n" +
					"the ListBuckets call was made without permissions.")
			default:
				log.Println("Expected AccessDenied, got something else.")
				panic(err)
			}
		}
	} else {
		log.Println("Expected AccessDenied error when calling ListBuckets without permissions,\n" +
			"but the call succeeded. Continuing the example anyway...")
	}
	log.Println(strings.Repeat("-", 88))
	return &noPermsConfig
}

// ListBucketsWithAssumedRole performs the following actions:
//
//  1. Creates an AWS Security Token Service (AWS STS) client from the config created from
//     the user's access key credentials.
//  2. Gets temporary credentials by assuming the role that grants permission to list the
//     buckets.
//  3. Creates an Amazon S3 client from the temporary credentials.
//  4. Lists buckets for the account. Because the temporary credentials are generated by
//     assuming the role that grants permission, the action succeeds.
func (scenario AssumeRoleScenario) ListBucketsWithAssumedRole(ctx context.Context, noPermsConfig *aws.Config, role *types.Role) {
	log.Println("Let's assume the role that grants permission to list buckets and try again.")
	scenario.questioner.Ask("Press Enter when you're ready.")
	stsClient := sts.NewFromConfig(*noPermsConfig)
	tempCredentials, err := stsClient.AssumeRole(ctx, &sts.AssumeRoleInput{
		RoleArn:         role.Arn,
		RoleSessionName: aws.String("AssumeRoleExampleSession"),
		DurationSeconds: aws.Int32(900),
	})
	if err != nil {
		log.Printf("Couldn't assume role %v.\n", *role.RoleName)
		panic(err)
	}
	log.Printf("Assumed role %v, got temporary credentials.\n", *role.RoleName)
	assumeRoleConfig, err := config.LoadDefaultConfig(ctx,
		config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
			*tempCredentials.Credentials.AccessKeyId,
			*tempCredentials.Credentials.SecretAccessKey,
			*tempCredentials.Credentials.SessionToken),
		),
	)
	if err != nil {
		panic(err)
	}

	// Add test options if this is a test run. This is needed only for testing purposes.
	scenario.addTestOptions(&assumeRoleConfig)

	s3Client := s3.NewFromConfig(assumeRoleConfig)
	result, err := s3Client.ListBuckets(ctx, &s3.ListBucketsInput{})
	if err != nil {
		log.Println("Couldn't list buckets with assumed role credentials.")
		panic(err)
	}
	log.Println("Successfully called ListBuckets with assumed role credentials, \n" +
		"here are some of them:")
	for i := 0; i < len(result.Buckets) && i < 5; i++ {
		log.Printf("\t%v\n", *result.Buckets[i].Name)
	}
	log.Println(strings.Repeat("-", 88))
}

// Cleanup deletes all resources created for the scenario.
func (scenario AssumeRoleScenario) Cleanup(ctx context.Context, user *types.User, role *types.Role) {
	if scenario.questioner.AskBool(
		"Do you want to delete the resources created for this example? (y/n)", "y",
	) {
		policies, err := scenario.roleWrapper.ListAttachedRolePolicies(ctx, *role.RoleName)
		if err != nil {
			panic(err)
		}
		for _, policy := range policies {
			err = scenario.roleWrapper.DetachRolePolicy(ctx, *role.RoleName, *policy.PolicyArn)
			if err != nil {
				panic(err)
			}
			err = scenario.policyWrapper.DeletePolicy(ctx, *policy.PolicyArn)
			if err != nil {
				panic(err)
			}
			log.Printf("Detached policy %v from role %v and deleted the policy.\n",
				*policy.PolicyName, *role.RoleName)
		}
		err = scenario.roleWrapper.DeleteRole(ctx, *role.RoleName)
		if err != nil {
			panic(err)
		}
		log.Printf("Deleted role %v.\n", *role.RoleName)

		userPols, err := scenario.userWrapper.ListUserPolicies(ctx, *user.UserName)
		if err != nil {
			panic(err)
		}
		for _, userPol := range userPols {
			err = scenario.userWrapper.DeleteUserPolicy(ctx, *user.UserName, userPol)
			if err != nil {
				panic(err)
			}
			log.Printf("Deleted policy %v from user %v.\n", userPol, *user.UserName)
		}
		keys, err := scenario.userWrapper.ListAccessKeys(ctx, *user.UserName)
		if err != nil {
			panic(err)
		}
		for _, key := range keys {
			err = scenario.userWrapper.DeleteAccessKey(ctx, *user.UserName, *key.AccessKeyId)
			if err != nil {
				panic(err)
			}
			log.Printf("Deleted access key %v from user %v.\n", *key.AccessKeyId, *user.UserName)
		}
		err = scenario.userWrapper.DeleteUser(ctx, *user.UserName)
		if err != nil {
			panic(err)
		}
		log.Printf("Deleted user %v.\n", *user.UserName)
		log.Println(strings.Repeat("-", 88))
	}

}

// IScenarioHelper abstracts input and wait functions from a scenario so that they
// can be mocked for unit testing.
type IScenarioHelper interface {
	GetName() string
	Pause(secs int)
}

const rMax = 100000

type ScenarioHelper struct {
	Prefix string
	Random *rand.Rand
}

// GetName returns a unique name formed of a prefix and a random number.
func (helper *ScenarioHelper) GetName() string {
	return fmt.Sprintf("%v%v", helper.Prefix, helper.Random.Intn(rMax))
}

// Pause waits for the specified number of seconds.
func (helper ScenarioHelper) Pause(secs int) {
	time.Sleep(time.Duration(secs) * time.Second)
}
```
Tentukan struct yang membungkus tindakan akun.  

```
import (
	"context"
	"log"

	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
)

// AccountWrapper encapsulates AWS Identity and Access Management (IAM) account actions
// used in the examples.
// It contains an IAM service client that is used to perform account actions.
type AccountWrapper struct {
	IamClient *iam.Client
}



// GetAccountPasswordPolicy gets the account password policy for the current account.
// If no policy has been set, a NoSuchEntityException is error is returned.
func (wrapper AccountWrapper) GetAccountPasswordPolicy(ctx context.Context) (*types.PasswordPolicy, error) {
	var pwPolicy *types.PasswordPolicy
	result, err := wrapper.IamClient.GetAccountPasswordPolicy(ctx,
		&iam.GetAccountPasswordPolicyInput{})
	if err != nil {
		log.Printf("Couldn't get account password policy. Here's why: %v\n", err)
	} else {
		pwPolicy = result.PasswordPolicy
	}
	return pwPolicy, err
}



// ListSAMLProviders gets the SAML providers for the account.
func (wrapper AccountWrapper) ListSAMLProviders(ctx context.Context) ([]types.SAMLProviderListEntry, error) {
	var providers []types.SAMLProviderListEntry
	result, err := wrapper.IamClient.ListSAMLProviders(ctx, &iam.ListSAMLProvidersInput{})
	if err != nil {
		log.Printf("Couldn't list SAML providers. Here's why: %v\n", err)
	} else {
		providers = result.SAMLProviderList
	}
	return providers, err
}
```
Tentukan struct yang membungkus tindakan kebijakan.  

```
import (
	"context"
	"encoding/json"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
)

// PolicyWrapper encapsulates AWS Identity and Access Management (IAM) policy actions
// used in the examples.
// It contains an IAM service client that is used to perform policy actions.
type PolicyWrapper struct {
	IamClient *iam.Client
}



// ListPolicies gets up to maxPolicies policies.
func (wrapper PolicyWrapper) ListPolicies(ctx context.Context, maxPolicies int32) ([]types.Policy, error) {
	var policies []types.Policy
	result, err := wrapper.IamClient.ListPolicies(ctx, &iam.ListPoliciesInput{
		MaxItems: aws.Int32(maxPolicies),
	})
	if err != nil {
		log.Printf("Couldn't list policies. Here's why: %v\n", err)
	} else {
		policies = result.Policies
	}
	return policies, err
}



// PolicyDocument defines a policy document as a Go struct that can be serialized
// to JSON.
type PolicyDocument struct {
	Version   string
	Statement []PolicyStatement
}

// PolicyStatement defines a statement in a policy document.
type PolicyStatement struct {
	Effect    string
	Action    []string
	Principal map[string]string `json:",omitempty"`
	Resource  *string           `json:",omitempty"`
}

// CreatePolicy creates a policy that grants a list of actions to the specified resource.
// PolicyDocument shows how to work with a policy document as a data structure and
// serialize it to JSON by using Go's JSON marshaler.
func (wrapper PolicyWrapper) CreatePolicy(ctx context.Context, policyName string, actions []string,
	resourceArn string) (*types.Policy, error) {
	var policy *types.Policy
	policyDoc := PolicyDocument{
		Version: "2012-10-17",
		Statement: []PolicyStatement{{
			Effect:   "Allow",
			Action:   actions,
			Resource: aws.String(resourceArn),
		}},
	}
	policyBytes, err := json.Marshal(policyDoc)
	if err != nil {
		log.Printf("Couldn't create policy document for %v. Here's why: %v\n", resourceArn, err)
		return nil, err
	}
	result, err := wrapper.IamClient.CreatePolicy(ctx, &iam.CreatePolicyInput{
		PolicyDocument: aws.String(string(policyBytes)),
		PolicyName:     aws.String(policyName),
	})
	if err != nil {
		log.Printf("Couldn't create policy %v. Here's why: %v\n", policyName, err)
	} else {
		policy = result.Policy
	}
	return policy, err
}



// GetPolicy gets data about a policy.
func (wrapper PolicyWrapper) GetPolicy(ctx context.Context, policyArn string) (*types.Policy, error) {
	var policy *types.Policy
	result, err := wrapper.IamClient.GetPolicy(ctx, &iam.GetPolicyInput{
		PolicyArn: aws.String(policyArn),
	})
	if err != nil {
		log.Printf("Couldn't get policy %v. Here's why: %v\n", policyArn, err)
	} else {
		policy = result.Policy
	}
	return policy, err
}



// DeletePolicy deletes a policy.
func (wrapper PolicyWrapper) DeletePolicy(ctx context.Context, policyArn string) error {
	_, err := wrapper.IamClient.DeletePolicy(ctx, &iam.DeletePolicyInput{
		PolicyArn: aws.String(policyArn),
	})
	if err != nil {
		log.Printf("Couldn't delete policy %v. Here's why: %v\n", policyArn, err)
	}
	return err
}
```
Tentukan struct yang membungkus tindakan peran.  

```
import (
	"context"
	"encoding/json"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
)

// RoleWrapper encapsulates AWS Identity and Access Management (IAM) role actions
// used in the examples.
// It contains an IAM service client that is used to perform role actions.
type RoleWrapper struct {
	IamClient *iam.Client
}



// ListRoles gets up to maxRoles roles.
func (wrapper RoleWrapper) ListRoles(ctx context.Context, maxRoles int32) ([]types.Role, error) {
	var roles []types.Role
	result, err := wrapper.IamClient.ListRoles(ctx,
		&iam.ListRolesInput{MaxItems: aws.Int32(maxRoles)},
	)
	if err != nil {
		log.Printf("Couldn't list roles. Here's why: %v\n", err)
	} else {
		roles = result.Roles
	}
	return roles, err
}



// CreateRole creates a role that trusts a specified user. The trusted user can assume
// the role to acquire its permissions.
// PolicyDocument shows how to work with a policy document as a data structure and
// serialize it to JSON by using Go's JSON marshaler.
func (wrapper RoleWrapper) CreateRole(ctx context.Context, roleName string, trustedUserArn string) (*types.Role, error) {
	var role *types.Role
	trustPolicy := PolicyDocument{
		Version: "2012-10-17",
		Statement: []PolicyStatement{{
			Effect:    "Allow",
			Principal: map[string]string{"AWS": trustedUserArn},
			Action:    []string{"sts:AssumeRole"},
		}},
	}
	policyBytes, err := json.Marshal(trustPolicy)
	if err != nil {
		log.Printf("Couldn't create trust policy for %v. Here's why: %v\n", trustedUserArn, err)
		return nil, err
	}
	result, err := wrapper.IamClient.CreateRole(ctx, &iam.CreateRoleInput{
		AssumeRolePolicyDocument: aws.String(string(policyBytes)),
		RoleName:                 aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't create role %v. Here's why: %v\n", roleName, err)
	} else {
		role = result.Role
	}
	return role, err
}



// GetRole gets data about a role.
func (wrapper RoleWrapper) GetRole(ctx context.Context, roleName string) (*types.Role, error) {
	var role *types.Role
	result, err := wrapper.IamClient.GetRole(ctx,
		&iam.GetRoleInput{RoleName: aws.String(roleName)})
	if err != nil {
		log.Printf("Couldn't get role %v. Here's why: %v\n", roleName, err)
	} else {
		role = result.Role
	}
	return role, err
}



// CreateServiceLinkedRole creates a service-linked role that is owned by the specified service.
func (wrapper RoleWrapper) CreateServiceLinkedRole(ctx context.Context, serviceName string, description string) (
	*types.Role, error) {
	var role *types.Role
	result, err := wrapper.IamClient.CreateServiceLinkedRole(ctx, &iam.CreateServiceLinkedRoleInput{
		AWSServiceName: aws.String(serviceName),
		Description:    aws.String(description),
	})
	if err != nil {
		log.Printf("Couldn't create service-linked role %v. Here's why: %v\n", serviceName, err)
	} else {
		role = result.Role
	}
	return role, err
}



// DeleteServiceLinkedRole deletes a service-linked role.
func (wrapper RoleWrapper) DeleteServiceLinkedRole(ctx context.Context, roleName string) error {
	_, err := wrapper.IamClient.DeleteServiceLinkedRole(ctx, &iam.DeleteServiceLinkedRoleInput{
		RoleName: aws.String(roleName)},
	)
	if err != nil {
		log.Printf("Couldn't delete service-linked role %v. Here's why: %v\n", roleName, err)
	}
	return err
}



// AttachRolePolicy attaches a policy to a role.
func (wrapper RoleWrapper) AttachRolePolicy(ctx context.Context, policyArn string, roleName string) error {
	_, err := wrapper.IamClient.AttachRolePolicy(ctx, &iam.AttachRolePolicyInput{
		PolicyArn: aws.String(policyArn),
		RoleName:  aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't attach policy %v to role %v. Here's why: %v\n", policyArn, roleName, err)
	}
	return err
}



// ListAttachedRolePolicies lists the policies that are attached to the specified role.
func (wrapper RoleWrapper) ListAttachedRolePolicies(ctx context.Context, roleName string) ([]types.AttachedPolicy, error) {
	var policies []types.AttachedPolicy
	result, err := wrapper.IamClient.ListAttachedRolePolicies(ctx, &iam.ListAttachedRolePoliciesInput{
		RoleName: aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't list attached policies for role %v. Here's why: %v\n", roleName, err)
	} else {
		policies = result.AttachedPolicies
	}
	return policies, err
}



// DetachRolePolicy detaches a policy from a role.
func (wrapper RoleWrapper) DetachRolePolicy(ctx context.Context, roleName string, policyArn string) error {
	_, err := wrapper.IamClient.DetachRolePolicy(ctx, &iam.DetachRolePolicyInput{
		PolicyArn: aws.String(policyArn),
		RoleName:  aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't detach policy from role %v. Here's why: %v\n", roleName, err)
	}
	return err
}



// ListRolePolicies lists the inline policies for a role.
func (wrapper RoleWrapper) ListRolePolicies(ctx context.Context, roleName string) ([]string, error) {
	var policies []string
	result, err := wrapper.IamClient.ListRolePolicies(ctx, &iam.ListRolePoliciesInput{
		RoleName: aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't list policies for role %v. Here's why: %v\n", roleName, err)
	} else {
		policies = result.PolicyNames
	}
	return policies, err
}



// DeleteRole deletes a role. All attached policies must be detached before a
// role can be deleted.
func (wrapper RoleWrapper) DeleteRole(ctx context.Context, roleName string) error {
	_, err := wrapper.IamClient.DeleteRole(ctx, &iam.DeleteRoleInput{
		RoleName: aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't delete role %v. Here's why: %v\n", roleName, err)
	}
	return err
}
```
Tentukan struct yang membungkus tindakan pengguna.  

```
import (
	"context"
	"encoding/json"
	"errors"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
	"github.com/aws/smithy-go"
)

// UserWrapper encapsulates user actions used in the examples.
// It contains an IAM service client that is used to perform user actions.
type UserWrapper struct {
	IamClient *iam.Client
}



// ListUsers gets up to maxUsers number of users.
func (wrapper UserWrapper) ListUsers(ctx context.Context, maxUsers int32) ([]types.User, error) {
	var users []types.User
	result, err := wrapper.IamClient.ListUsers(ctx, &iam.ListUsersInput{
		MaxItems: aws.Int32(maxUsers),
	})
	if err != nil {
		log.Printf("Couldn't list users. Here's why: %v\n", err)
	} else {
		users = result.Users
	}
	return users, err
}



// GetUser gets data about a user.
func (wrapper UserWrapper) GetUser(ctx context.Context, userName string) (*types.User, error) {
	var user *types.User
	result, err := wrapper.IamClient.GetUser(ctx, &iam.GetUserInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		var apiError smithy.APIError
		if errors.As(err, &apiError) {
			switch apiError.(type) {
			case *types.NoSuchEntityException:
				log.Printf("User %v does not exist.\n", userName)
				err = nil
			default:
				log.Printf("Couldn't get user %v. Here's why: %v\n", userName, err)
			}
		}
	} else {
		user = result.User
	}
	return user, err
}



// CreateUser creates a new user with the specified name.
func (wrapper UserWrapper) CreateUser(ctx context.Context, userName string) (*types.User, error) {
	var user *types.User
	result, err := wrapper.IamClient.CreateUser(ctx, &iam.CreateUserInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't create user %v. Here's why: %v\n", userName, err)
	} else {
		user = result.User
	}
	return user, err
}



// CreateUserPolicy adds an inline policy to a user. This example creates a policy that
// grants a list of actions on a specified role.
// PolicyDocument shows how to work with a policy document as a data structure and
// serialize it to JSON by using Go's JSON marshaler.
func (wrapper UserWrapper) CreateUserPolicy(ctx context.Context, userName string, policyName string, actions []string,
	roleArn string) error {
	policyDoc := PolicyDocument{
		Version: "2012-10-17",
		Statement: []PolicyStatement{{
			Effect:   "Allow",
			Action:   actions,
			Resource: aws.String(roleArn),
		}},
	}
	policyBytes, err := json.Marshal(policyDoc)
	if err != nil {
		log.Printf("Couldn't create policy document for %v. Here's why: %v\n", roleArn, err)
		return err
	}
	_, err = wrapper.IamClient.PutUserPolicy(ctx, &iam.PutUserPolicyInput{
		PolicyDocument: aws.String(string(policyBytes)),
		PolicyName:     aws.String(policyName),
		UserName:       aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't create policy for user %v. Here's why: %v\n", userName, err)
	}
	return err
}



// ListUserPolicies lists the inline policies for the specified user.
func (wrapper UserWrapper) ListUserPolicies(ctx context.Context, userName string) ([]string, error) {
	var policies []string
	result, err := wrapper.IamClient.ListUserPolicies(ctx, &iam.ListUserPoliciesInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't list policies for user %v. Here's why: %v\n", userName, err)
	} else {
		policies = result.PolicyNames
	}
	return policies, err
}



// DeleteUserPolicy deletes an inline policy from a user.
func (wrapper UserWrapper) DeleteUserPolicy(ctx context.Context, userName string, policyName string) error {
	_, err := wrapper.IamClient.DeleteUserPolicy(ctx, &iam.DeleteUserPolicyInput{
		PolicyName: aws.String(policyName),
		UserName:   aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't delete policy from user %v. Here's why: %v\n", userName, err)
	}
	return err
}



// DeleteUser deletes a user.
func (wrapper UserWrapper) DeleteUser(ctx context.Context, userName string) error {
	_, err := wrapper.IamClient.DeleteUser(ctx, &iam.DeleteUserInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't delete user %v. Here's why: %v\n", userName, err)
	}
	return err
}



// CreateAccessKeyPair creates an access key for a user. The returned access key contains
// the ID and secret credentials needed to use the key.
func (wrapper UserWrapper) CreateAccessKeyPair(ctx context.Context, userName string) (*types.AccessKey, error) {
	var key *types.AccessKey
	result, err := wrapper.IamClient.CreateAccessKey(ctx, &iam.CreateAccessKeyInput{
		UserName: aws.String(userName)})
	if err != nil {
		log.Printf("Couldn't create access key pair for user %v. Here's why: %v\n", userName, err)
	} else {
		key = result.AccessKey
	}
	return key, err
}



// DeleteAccessKey deletes an access key from a user.
func (wrapper UserWrapper) DeleteAccessKey(ctx context.Context, userName string, keyId string) error {
	_, err := wrapper.IamClient.DeleteAccessKey(ctx, &iam.DeleteAccessKeyInput{
		AccessKeyId: aws.String(keyId),
		UserName:    aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't delete access key %v. Here's why: %v\n", keyId, err)
	}
	return err
}



// ListAccessKeys lists the access keys for the specified user.
func (wrapper UserWrapper) ListAccessKeys(ctx context.Context, userName string) ([]types.AccessKeyMetadata, error) {
	var keys []types.AccessKeyMetadata
	result, err := wrapper.IamClient.ListAccessKeys(ctx, &iam.ListAccessKeysInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't list access keys for user %v. Here's why: %v\n", userName, err)
	} else {
		keys = result.AccessKeyMetadata
	}
	return keys, err
}
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK untuk Go *.
  + [AttachRolePolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.AttachRolePolicy)
  + [CreateAccessKey](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.CreateAccessKey)
  + [CreatePolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.CreatePolicy)
  + [CreateRole](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.CreateRole)
  + [CreateUser](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.CreateUser)
  + [DeleteAccessKey](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeleteAccessKey)
  + [DeletePolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeletePolicy)
  + [DeleteRole](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeleteRole)
  + [DeleteUser](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeleteUser)
  + [DeleteUserPolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeleteUserPolicy)
  + [DetachRolePolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DetachRolePolicy)
  + [PutUserPolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.PutUserPolicy)

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/iam#code-examples). 
Buat fungsi yang membungkus tindakan pengguna IAM.  

```
/*
  To run this Java V2 code example, set up your development environment, including your credentials.

  For information, see this documentation topic:

  https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html

  This example performs these operations:

  1. Creates a user that has no permissions.
  2. Creates a role and policy that grants Amazon S3 permissions.
  3. Creates a role.
  4. Grants the user permissions.
  5. Gets temporary credentials by assuming the role.  Creates an Amazon S3 Service client object with the temporary credentials.
  6. Deletes the resources.
 */

public class IAMScenario {
    public static final String DASHES = new String(new char[80]).replace("\0", "-");
    public static final String PolicyDocument = "{" +
            "  \"Version\": \"2012-10-17\"," +
            "  \"Statement\": [" +
            "    {" +
            "        \"Effect\": \"Allow\"," +
            "        \"Action\": [" +
            "            \"s3:*\"" +
            "       ]," +
            "       \"Resource\": \"*\"" +
            "    }" +
            "   ]" +
            "}";

    public static String userArn;

    public static void main(String[] args) throws Exception {

        final String usage = """

                Usage:
                    <username> <policyName> <roleName> <roleSessionName> <bucketName>\s

                Where:
                    username - The name of the IAM user to create.\s
                    policyName - The name of the policy to create.\s
                    roleName - The name of the role to create.\s
                    roleSessionName - The name of the session required for the assumeRole operation.\s
                    bucketName - The name of the Amazon S3 bucket from which objects are read.\s
                """;

        if (args.length != 5) {
            System.out.println(usage);
            System.exit(1);
        }

        String userName = args[0];
        String policyName = args[1];
        String roleName = args[2];
        String roleSessionName = args[3];
        String bucketName = args[4];

        Region region = Region.AWS_GLOBAL;
        IamClient iam = IamClient.builder()
                .region(region)
                .build();

        System.out.println(DASHES);
        System.out.println("Welcome to the AWS IAM example scenario.");
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println(" 1. Create the IAM user.");
        User createUser = createIAMUser(iam, userName);

        System.out.println(DASHES);
        userArn = createUser.arn();

        AccessKey myKey = createIAMAccessKey(iam, userName);
        String accessKey = myKey.accessKeyId();
        String secretKey = myKey.secretAccessKey();
        String assumeRolePolicyDocument = "{" +
                "\"Version\": \"2012-10-17\"," +
                "\"Statement\": [{" +
                "\"Effect\": \"Allow\"," +
                "\"Principal\": {" +
                "	\"AWS\": \"" + userArn + "\"" +
                "}," +
                "\"Action\": \"sts:AssumeRole\"" +
                "}]" +
                "}";

        System.out.println(assumeRolePolicyDocument);
        System.out.println(userName + " was successfully created.");
        System.out.println(DASHES);
        System.out.println("2. Creates a policy.");
        String polArn = createIAMPolicy(iam, policyName);
        System.out.println("The policy " + polArn + " was successfully created.");
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("3. Creates a role.");
        TimeUnit.SECONDS.sleep(30);
        String roleArn = createIAMRole(iam, roleName, assumeRolePolicyDocument);
        System.out.println(roleArn + " was successfully created.");
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("4. Grants the user permissions.");
        attachIAMRolePolicy(iam, roleName, polArn);
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("*** Wait for 30 secs so the resource is available");
        TimeUnit.SECONDS.sleep(30);
        System.out.println("5. Gets temporary credentials by assuming the role.");
        System.out.println("Perform an Amazon S3 Service operation using the temporary credentials.");
        assumeRole(roleArn, roleSessionName, bucketName, accessKey, secretKey);
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("6 Getting ready to delete the AWS resources");
        deleteKey(iam, userName, accessKey);
        deleteRole(iam, roleName, polArn);
        deleteIAMUser(iam, userName);
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("This IAM Scenario has successfully completed");
        System.out.println(DASHES);
    }

    public static AccessKey createIAMAccessKey(IamClient iam, String user) {
        try {
            CreateAccessKeyRequest request = CreateAccessKeyRequest.builder()
                    .userName(user)
                    .build();

            CreateAccessKeyResponse response = iam.createAccessKey(request);
            return response.accessKey();

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return null;
    }

    public static User createIAMUser(IamClient iam, String username) {
        try {
            // Create an IamWaiter object
            IamWaiter iamWaiter = iam.waiter();
            CreateUserRequest request = CreateUserRequest.builder()
                    .userName(username)
                    .build();

            // Wait until the user is created.
            CreateUserResponse response = iam.createUser(request);
            GetUserRequest userRequest = GetUserRequest.builder()
                    .userName(response.user().userName())
                    .build();

            WaiterResponse<GetUserResponse> waitUntilUserExists = iamWaiter.waitUntilUserExists(userRequest);
            waitUntilUserExists.matched().response().ifPresent(System.out::println);
            return response.user();

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return null;
    }

    public static String createIAMRole(IamClient iam, String rolename, String json) {

        try {
            CreateRoleRequest request = CreateRoleRequest.builder()
                    .roleName(rolename)
                    .assumeRolePolicyDocument(json)
                    .description("Created using the AWS SDK for Java")
                    .build();

            CreateRoleResponse response = iam.createRole(request);
            System.out.println("The ARN of the role is " + response.role().arn());
            return response.role().arn();

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return "";
    }

    public static String createIAMPolicy(IamClient iam, String policyName) {
        try {
            // Create an IamWaiter object.
            IamWaiter iamWaiter = iam.waiter();
            CreatePolicyRequest request = CreatePolicyRequest.builder()
                    .policyName(policyName)
                    .policyDocument(PolicyDocument).build();

            CreatePolicyResponse response = iam.createPolicy(request);
            GetPolicyRequest polRequest = GetPolicyRequest.builder()
                    .policyArn(response.policy().arn())
                    .build();

            WaiterResponse<GetPolicyResponse> waitUntilPolicyExists = iamWaiter.waitUntilPolicyExists(polRequest);
            waitUntilPolicyExists.matched().response().ifPresent(System.out::println);
            return response.policy().arn();

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return "";
    }

    public static void attachIAMRolePolicy(IamClient iam, String roleName, String policyArn) {
        try {
            ListAttachedRolePoliciesRequest request = ListAttachedRolePoliciesRequest.builder()
                    .roleName(roleName)
                    .build();

            ListAttachedRolePoliciesResponse response = iam.listAttachedRolePolicies(request);
            List<AttachedPolicy> attachedPolicies = response.attachedPolicies();
            String polArn;
            for (AttachedPolicy policy : attachedPolicies) {
                polArn = policy.policyArn();
                if (polArn.compareTo(policyArn) == 0) {
                    System.out.println(roleName + " policy is already attached to this role.");
                    return;
                }
            }

            AttachRolePolicyRequest attachRequest = AttachRolePolicyRequest.builder()
                    .roleName(roleName)
                    .policyArn(policyArn)
                    .build();

            iam.attachRolePolicy(attachRequest);
            System.out.println("Successfully attached policy " + policyArn + " to role " + roleName);

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }

    // Invoke an Amazon S3 operation using the Assumed Role.
    public static void assumeRole(String roleArn, String roleSessionName, String bucketName, String keyVal,
            String keySecret) {

        // Use the creds of the new IAM user that was created in this code example.
        AwsBasicCredentials credentials = AwsBasicCredentials.create(keyVal, keySecret);
        StsClient stsClient = StsClient.builder()
                .region(Region.US_EAST_1)
                .credentialsProvider(StaticCredentialsProvider.create(credentials))
                .build();

        try {
            AssumeRoleRequest roleRequest = AssumeRoleRequest.builder()
                    .roleArn(roleArn)
                    .roleSessionName(roleSessionName)
                    .build();

            AssumeRoleResponse roleResponse = stsClient.assumeRole(roleRequest);
            Credentials myCreds = roleResponse.credentials();
            String key = myCreds.accessKeyId();
            String secKey = myCreds.secretAccessKey();
            String secToken = myCreds.sessionToken();

            // List all objects in an Amazon S3 bucket using the temp creds retrieved by
            // invoking assumeRole.
            Region region = Region.US_EAST_1;
            S3Client s3 = S3Client.builder()
                    .credentialsProvider(
                            StaticCredentialsProvider.create(AwsSessionCredentials.create(key, secKey, secToken)))
                    .region(region)
                    .build();

            System.out.println("Created a S3Client using temp credentials.");
            System.out.println("Listing objects in " + bucketName);
            ListObjectsRequest listObjects = ListObjectsRequest.builder()
                    .bucket(bucketName)
                    .build();

            ListObjectsResponse res = s3.listObjects(listObjects);
            List<S3Object> objects = res.contents();
            for (S3Object myValue : objects) {
                System.out.println("The name of the key is " + myValue.key());
                System.out.println("The owner is " + myValue.owner());
            }

        } catch (StsException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }

    public static void deleteRole(IamClient iam, String roleName, String polArn) {

        try {
            // First the policy needs to be detached.
            DetachRolePolicyRequest rolePolicyRequest = DetachRolePolicyRequest.builder()
                    .policyArn(polArn)
                    .roleName(roleName)
                    .build();

            iam.detachRolePolicy(rolePolicyRequest);

            // Delete the policy.
            DeletePolicyRequest request = DeletePolicyRequest.builder()
                    .policyArn(polArn)
                    .build();

            iam.deletePolicy(request);
            System.out.println("*** Successfully deleted " + polArn);

            // Delete the role.
            DeleteRoleRequest roleRequest = DeleteRoleRequest.builder()
                    .roleName(roleName)
                    .build();

            iam.deleteRole(roleRequest);
            System.out.println("*** Successfully deleted " + roleName);

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }

    public static void deleteKey(IamClient iam, String username, String accessKey) {
        try {
            DeleteAccessKeyRequest request = DeleteAccessKeyRequest.builder()
                    .accessKeyId(accessKey)
                    .userName(username)
                    .build();

            iam.deleteAccessKey(request);
            System.out.println("Successfully deleted access key " + accessKey +
                    " from user " + username);

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }

    public static void deleteIAMUser(IamClient iam, String userName) {
        try {
            DeleteUserRequest request = DeleteUserRequest.builder()
                    .userName(userName)
                    .build();

            iam.deleteUser(request);
            System.out.println("*** Successfully deleted " + userName);

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK for Java 2.x *.
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/PutUserPolicy)

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/iam#code-examples). 
Buat pengguna IAM dan peran yang memberikan izin untuk mencantumkan bucket Amazon S3. Pengguna hanya memiliki hak untuk mengambil peran. Setelah mengambil peran, gunakan kredensyal sementara untuk membuat daftar bucket untuk akun.  

```
import {
  CreateUserCommand,
  GetUserCommand,
  CreateAccessKeyCommand,
  CreatePolicyCommand,
  CreateRoleCommand,
  AttachRolePolicyCommand,
  DeleteAccessKeyCommand,
  DeleteUserCommand,
  DeleteRoleCommand,
  DeletePolicyCommand,
  DetachRolePolicyCommand,
  IAMClient,
} from "@aws-sdk/client-iam";
import { ListBucketsCommand, S3Client } from "@aws-sdk/client-s3";
import { AssumeRoleCommand, STSClient } from "@aws-sdk/client-sts";
import { retry } from "@aws-doc-sdk-examples/lib/utils/util-timers.js";
import { ScenarioInput } from "@aws-doc-sdk-examples/lib/scenario/index.js";

// Set the parameters.
const iamClient = new IAMClient({});
const userName = "iam_basic_test_username";
const policyName = "iam_basic_test_policy";
const roleName = "iam_basic_test_role";

/**
 * Create a new IAM user. If the user already exists, give
 * the option to delete and re-create it.
 * @param {string} name
 */
export const createUser = async (name, confirmAll = false) => {
  try {
    const { User } = await iamClient.send(
      new GetUserCommand({ UserName: name }),
    );
    const input = new ScenarioInput(
      "deleteUser",
      "Do you want to delete and remake this user?",
      { type: "confirm" },
    );
    const deleteUser = await input.handle({}, { confirmAll });
    // If the user exists, and you want to delete it, delete the user
    // and then create it again.
    if (deleteUser) {
      await iamClient.send(new DeleteUserCommand({ UserName: User.UserName }));
      await iamClient.send(new CreateUserCommand({ UserName: name }));
    } else {
      console.warn(
        `${name} already exists. The scenario may not work as expected.`,
      );
      return User;
    }
  } catch (caught) {
    // If there is no user by that name, create one.
    if (caught instanceof Error && caught.name === "NoSuchEntityException") {
      const { User } = await iamClient.send(
        new CreateUserCommand({ UserName: name }),
      );
      return User;
    }
    throw caught;
  }
};

export const main = async (confirmAll = false) => {
  // Create a user. The user has no permissions by default.
  const User = await createUser(userName, confirmAll);

  if (!User) {
    throw new Error("User not created");
  }

  // Create an access key. This key is used to authenticate the new user to
  // Amazon Simple Storage Service (Amazon S3) and AWS Security Token Service (AWS STS).
  // It's not best practice to use access keys. For more information, see https://aws.amazon.com/iam/resources/best-practices/.
  const createAccessKeyResponse = await iamClient.send(
    new CreateAccessKeyCommand({ UserName: userName }),
  );

  if (
    !createAccessKeyResponse.AccessKey?.AccessKeyId ||
    !createAccessKeyResponse.AccessKey?.SecretAccessKey
  ) {
    throw new Error("Access key not created");
  }

  const {
    AccessKey: { AccessKeyId, SecretAccessKey },
  } = createAccessKeyResponse;

  let s3Client = new S3Client({
    credentials: {
      accessKeyId: AccessKeyId,
      secretAccessKey: SecretAccessKey,
    },
  });

  // Retry the list buckets operation until it succeeds. InvalidAccessKeyId is
  // thrown while the user and access keys are still stabilizing.
  await retry({ intervalInMs: 1000, maxRetries: 300 }, async () => {
    try {
      return await listBuckets(s3Client);
    } catch (err) {
      if (err instanceof Error && err.name === "InvalidAccessKeyId") {
        throw err;
      }
    }
  });

  // Retry the create role operation until it succeeds. A MalformedPolicyDocument error
  // is thrown while the user and access keys are still stabilizing.
  const { Role } = await retry(
    {
      intervalInMs: 2000,
      maxRetries: 60,
    },
    () =>
      iamClient.send(
        new CreateRoleCommand({
          AssumeRolePolicyDocument: JSON.stringify({
            Version: "2012-10-17",
            Statement: [
              {
                Effect: "Allow",
                Principal: {
                  // Allow the previously created user to assume this role.
                  AWS: User.Arn,
                },
                Action: "sts:AssumeRole",
              },
            ],
          }),
          RoleName: roleName,
        }),
      ),
  );

  if (!Role) {
    throw new Error("Role not created");
  }

  // Create a policy that allows the user to list S3 buckets.
  const { Policy: listBucketPolicy } = await iamClient.send(
    new CreatePolicyCommand({
      PolicyDocument: JSON.stringify({
        Version: "2012-10-17",
        Statement: [
          {
            Effect: "Allow",
            Action: ["s3:ListAllMyBuckets"],
            Resource: "*",
          },
        ],
      }),
      PolicyName: policyName,
    }),
  );

  if (!listBucketPolicy) {
    throw new Error("Policy not created");
  }

  // Attach the policy granting the 's3:ListAllMyBuckets' action to the role.
  await iamClient.send(
    new AttachRolePolicyCommand({
      PolicyArn: listBucketPolicy.Arn,
      RoleName: Role.RoleName,
    }),
  );

  // Assume the role.
  const stsClient = new STSClient({
    credentials: {
      accessKeyId: AccessKeyId,
      secretAccessKey: SecretAccessKey,
    },
  });

  // Retry the assume role operation until it succeeds.
  const { Credentials } = await retry(
    { intervalInMs: 2000, maxRetries: 60 },
    () =>
      stsClient.send(
        new AssumeRoleCommand({
          RoleArn: Role.Arn,
          RoleSessionName: `iamBasicScenarioSession-${Math.floor(
            Math.random() * 1000000,
          )}`,
          DurationSeconds: 900,
        }),
      ),
  );

  if (!Credentials?.AccessKeyId || !Credentials?.SecretAccessKey) {
    throw new Error("Credentials not created");
  }

  s3Client = new S3Client({
    credentials: {
      accessKeyId: Credentials.AccessKeyId,
      secretAccessKey: Credentials.SecretAccessKey,
      sessionToken: Credentials.SessionToken,
    },
  });

  // List the S3 buckets again.
  // Retry the list buckets operation until it succeeds. AccessDenied might
  // be thrown while the role policy is still stabilizing.
  await retry({ intervalInMs: 2000, maxRetries: 120 }, () =>
    listBuckets(s3Client),
  );

  // Clean up.
  await iamClient.send(
    new DetachRolePolicyCommand({
      PolicyArn: listBucketPolicy.Arn,
      RoleName: Role.RoleName,
    }),
  );

  await iamClient.send(
    new DeletePolicyCommand({
      PolicyArn: listBucketPolicy.Arn,
    }),
  );

  await iamClient.send(
    new DeleteRoleCommand({
      RoleName: Role.RoleName,
    }),
  );

  await iamClient.send(
    new DeleteAccessKeyCommand({
      UserName: userName,
      AccessKeyId,
    }),
  );

  await iamClient.send(
    new DeleteUserCommand({
      UserName: userName,
    }),
  );
};

/**
 *
 * @param {S3Client} s3Client
 */
const listBuckets = async (s3Client) => {
  const { Buckets } = await s3Client.send(new ListBucketsCommand({}));

  if (!Buckets) {
    throw new Error("Buckets not listed");
  }

  console.log(Buckets.map((bucket) => bucket.Name).join("\n"));
};
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK untuk JavaScript *.
  + [AttachRolePolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/AttachRolePolicyCommand)
  + [CreateAccessKey](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/CreateAccessKeyCommand)
  + [CreatePolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/CreatePolicyCommand)
  + [CreateRole](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/CreateRoleCommand)
  + [CreateUser](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/CreateUserCommand)
  + [DeleteAccessKey](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeleteAccessKeyCommand)
  + [DeletePolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeletePolicyCommand)
  + [DeleteRole](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeleteRoleCommand)
  + [DeleteUser](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeleteUserCommand)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeleteUserPolicyCommand)
  + [DetachRolePolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DetachRolePolicyCommand)
  + [PutUserPolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/PutUserPolicyCommand)

------
#### [ Kotlin ]

**SDK untuk Kotlin**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/iam#code-examples). 
Buat fungsi yang membungkus tindakan pengguna IAM.  

```
suspend fun main(args: Array<String>) {
    val usage = """
    Usage:
        <username> <policyName> <roleName> <roleSessionName> <fileLocation> <bucketName> 

    Where:
        username - The name of the IAM user to create. 
        policyName - The name of the policy to create. 
        roleName - The name of the role to create. 
        roleSessionName - The name of the session required for the assumeRole operation. 
        fileLocation - The file location to the JSON required to create the role (see Readme). 
        bucketName - The name of the Amazon S3 bucket from which objects are read. 
    """

    if (args.size != 6) {
        println(usage)
        exitProcess(1)
    }

    val userName = args[0]
    val policyName = args[1]
    val roleName = args[2]
    val roleSessionName = args[3]
    val fileLocation = args[4]
    val bucketName = args[5]

    createUser(userName)
    println("$userName was successfully created.")

    val polArn = createPolicy(policyName)
    println("The policy $polArn was successfully created.")

    val roleArn = createRole(roleName, fileLocation)
    println("$roleArn was successfully created.")
    attachRolePolicy(roleName, polArn)

    println("*** Wait for 1 MIN so the resource is available.")
    delay(60000)
    assumeGivenRole(roleArn, roleSessionName, bucketName)

    println("*** Getting ready to delete the AWS resources.")
    deleteRole(roleName, polArn)
    deleteUser(userName)
    println("This IAM Scenario has successfully completed.")
}

suspend fun createUser(usernameVal: String?): String? {
    val request =
        CreateUserRequest {
            userName = usernameVal
        }

    IamClient { region = "AWS_GLOBAL" }.use { iamClient ->
        val response = iamClient.createUser(request)
        return response.user?.userName
    }
}

suspend fun createPolicy(policyNameVal: String?): String {
    val policyDocumentValue = """
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:*"
                ],
                "Resource": "*"
            }
        ]
    }
    """.trimIndent()

    val request =
        CreatePolicyRequest {
            policyName = policyNameVal
            policyDocument = policyDocumentValue
        }

    IamClient.fromEnvironment { region = "AWS_GLOBAL" }.use { iamClient ->
        val response = iamClient.createPolicy(request)
        return response.policy?.arn.toString()
    }
}

suspend fun createRole(
    rolenameVal: String?,
    fileLocation: String?,
): String? {
    val jsonObject = fileLocation?.let { readJsonSimpleDemo(it) } as JSONObject

    val request =
        CreateRoleRequest {
            roleName = rolenameVal
            assumeRolePolicyDocument = jsonObject.toJSONString()
            description = "Created using the AWS SDK for Kotlin"
        }

    IamClient { region = "AWS_GLOBAL" }.use { iamClient ->
        val response = iamClient.createRole(request)
        return response.role?.arn
    }
}

suspend fun attachRolePolicy(
    roleNameVal: String,
    policyArnVal: String,
) {
    val request =
        ListAttachedRolePoliciesRequest {
            roleName = roleNameVal
        }

    IamClient.fromEnvironment { region = "AWS_GLOBAL" }.use { iamClient ->
        val response = iamClient.listAttachedRolePolicies(request)
        val attachedPolicies = response.attachedPolicies

        // Ensure that the policy is not attached to this role.
        val checkStatus: Int
        if (attachedPolicies != null) {
            checkStatus = checkMyList(attachedPolicies, policyArnVal)
            if (checkStatus == -1) {
                return
            }
        }

        val policyRequest =
            AttachRolePolicyRequest {
                roleName = roleNameVal
                policyArn = policyArnVal
            }
        iamClient.attachRolePolicy(policyRequest)
        println("Successfully attached policy $policyArnVal to role $roleNameVal")
    }
}

fun checkMyList(
    attachedPolicies: List<AttachedPolicy>,
    policyArnVal: String,
): Int {
    for (policy in attachedPolicies) {
        val polArn = policy.policyArn.toString()

        if (polArn.compareTo(policyArnVal) == 0) {
            println("The policy is already attached to this role.")
            return -1
        }
    }
    return 0
}

suspend fun assumeGivenRole(
    roleArnVal: String?,
    roleSessionNameVal: String?,
    bucketName: String,
) {
    val stsClient = StsClient.fromEnvironment { region = "us-east-1" }
    val roleRequest =
        AssumeRoleRequest {
            roleArn = roleArnVal
            roleSessionName = roleSessionNameVal
        }

    val roleResponse = stsClient.assumeRole(roleRequest)
    val myCreds = roleResponse.credentials
    val key = myCreds?.accessKeyId
    val secKey = myCreds?.secretAccessKey
    val secToken = myCreds?.sessionToken

    val staticCredentials = StaticCredentialsProvider {
        accessKeyId = key
        secretAccessKey = secKey
        sessionToken = secToken
    }

    // List all objects in an Amazon S3 bucket using the temp creds.
    val s3 = S3Client.fromEnvironment {
        region = "us-east-1"
        credentialsProvider = staticCredentials
    }

    println("Created a S3Client using temp credentials.")
    println("Listing objects in $bucketName")

    val listObjects =
        ListObjectsRequest {
            bucket = bucketName
        }

    val response = s3.listObjects(listObjects)
    response.contents?.forEach { myObject ->
        println("The name of the key is ${myObject.key}")
        println("The owner is ${myObject.owner}")
    }
}

suspend fun deleteRole(
    roleNameVal: String,
    polArn: String,
) {
    val iam = IamClient.fromEnvironment { region = "AWS_GLOBAL" }

    // First the policy needs to be detached.
    val rolePolicyRequest =
        DetachRolePolicyRequest {
            policyArn = polArn
            roleName = roleNameVal
        }

    iam.detachRolePolicy(rolePolicyRequest)

    // Delete the policy.
    val request =
        DeletePolicyRequest {
            policyArn = polArn
        }

    iam.deletePolicy(request)
    println("*** Successfully deleted $polArn")

    // Delete the role.
    val roleRequest =
        DeleteRoleRequest {
            roleName = roleNameVal
        }

    iam.deleteRole(roleRequest)
    println("*** Successfully deleted $roleNameVal")
}

suspend fun deleteUser(userNameVal: String) {
    val iam = IamClient.fromEnvironment { region = "AWS_GLOBAL" }
    val request =
        DeleteUserRequest {
            userName = userNameVal
        }

    iam.deleteUser(request)
    println("*** Successfully deleted $userNameVal")
}

@Throws(java.lang.Exception::class)
fun readJsonSimpleDemo(filename: String): Any? {
    val reader = FileReader(filename)
    val jsonParser = JSONParser()
    return jsonParser.parse(reader)
}
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK untuk Kotlin*.
  + [AttachRolePolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [CreateAccessKey](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [CreatePolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [CreateRole](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [CreateUser](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeleteAccessKey](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeletePolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeleteRole](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeleteUser](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeleteUserPolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DetachRolePolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [PutUserPolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkap dan pelajari cara menyiapkan dan menjalankan di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/iam#code-examples). 

```
namespace Iam\Basics;

require 'vendor/autoload.php';

use Aws\Credentials\Credentials;
use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;
use Aws\Sts\StsClient;
use Iam\IAMService;

echo("\n");
echo("--------------------------------------\n");
print("Welcome to the IAM getting started demo using PHP!\n");
echo("--------------------------------------\n");

$uuid = uniqid();
$service = new IAMService();

$user = $service->createUser("iam_demo_user_$uuid");
echo "Created user with the arn: {$user['Arn']}\n";

$key = $service->createAccessKey($user['UserName']);
$assumeRolePolicyDocument = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Principal\": {\"AWS\": \"{$user['Arn']}\"},
                    \"Action\": \"sts:AssumeRole\"
                }]
            }";
$assumeRoleRole = $service->createRole("iam_demo_role_$uuid", $assumeRolePolicyDocument);
echo "Created role: {$assumeRoleRole['RoleName']}\n";

$listAllBucketsPolicyDocument = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"s3:ListAllMyBuckets\",
                    \"Resource\": \"arn:aws:s3:::*\"}]
}";
$listAllBucketsPolicy = $service->createPolicy("iam_demo_policy_$uuid", $listAllBucketsPolicyDocument);
echo "Created policy: {$listAllBucketsPolicy['PolicyName']}\n";

$service->attachRolePolicy($assumeRoleRole['RoleName'], $listAllBucketsPolicy['Arn']);

$inlinePolicyDocument = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"sts:AssumeRole\",
                    \"Resource\": \"{$assumeRoleRole['Arn']}\"}]
}";
$inlinePolicy = $service->createUserPolicy("iam_demo_inline_policy_$uuid", $inlinePolicyDocument, $user['UserName']);
//First, fail to list the buckets with the user
$credentials = new Credentials($key['AccessKeyId'], $key['SecretAccessKey']);
$s3Client = new S3Client(['region' => 'us-west-2', 'version' => 'latest', 'credentials' => $credentials]);
try {
    $s3Client->listBuckets([
    ]);
    echo "this should not run";
} catch (S3Exception $exception) {
    echo "successfully failed!\n";
}

$stsClient = new StsClient(['region' => 'us-west-2', 'version' => 'latest', 'credentials' => $credentials]);
sleep(10);
$assumedRole = $stsClient->assumeRole([
    'RoleArn' => $assumeRoleRole['Arn'],
    'RoleSessionName' => "DemoAssumeRoleSession_$uuid",
]);
$assumedCredentials = [
    'key' => $assumedRole['Credentials']['AccessKeyId'],
    'secret' => $assumedRole['Credentials']['SecretAccessKey'],
    'token' => $assumedRole['Credentials']['SessionToken'],
];
$s3Client = new S3Client(['region' => 'us-west-2', 'version' => 'latest', 'credentials' => $assumedCredentials]);
try {
    $s3Client->listBuckets([]);
    echo "this should now run!\n";
} catch (S3Exception $exception) {
    echo "this should now not fail\n";
}

$service->detachRolePolicy($assumeRoleRole['RoleName'], $listAllBucketsPolicy['Arn']);
$deletePolicy = $service->deletePolicy($listAllBucketsPolicy['Arn']);
echo "Delete policy: {$listAllBucketsPolicy['PolicyName']}\n";
$deletedRole = $service->deleteRole($assumeRoleRole['Arn']);
echo "Deleted role: {$assumeRoleRole['RoleName']}\n";
$deletedKey = $service->deleteAccessKey($key['AccessKeyId'], $user['UserName']);
$deletedUser = $service->deleteUser($user['UserName']);
echo "Delete user: {$user['UserName']}\n";
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK untuk PHP *.
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/PutUserPolicy)

------
#### [ Python ]

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/iam#code-examples). 
Buat pengguna IAM dan peran yang memberikan izin untuk mencantumkan bucket Amazon S3. Pengguna hanya memiliki hak untuk mengambil peran. Setelah mengambil peran, gunakan kredensyal sementara untuk membuat daftar bucket untuk akun.  

```
import json
import sys
import time
from uuid import uuid4

import boto3
from botocore.exceptions import ClientError


def progress_bar(seconds):
    """Shows a simple progress bar in the command window."""
    for _ in range(seconds):
        time.sleep(1)
        print(".", end="")
        sys.stdout.flush()
    print()


def setup(iam_resource):
    """
    Creates a new user with no permissions.
    Creates an access key pair for the user.
    Creates a role with a policy that lets the user assume the role.
    Creates a policy that allows listing Amazon S3 buckets.
    Attaches the policy to the role.
    Creates an inline policy for the user that lets the user assume the role.

    :param iam_resource: A Boto3 AWS Identity and Access Management (IAM) resource
                         that has permissions to create users, roles, and policies
                         in the account.
    :return: The newly created user, user key, and role.
    """
    try:
        user = iam_resource.create_user(UserName=f"demo-user-{uuid4()}")
        print(f"Created user {user.name}.")
    except ClientError as error:
        print(
            f"Couldn't create a user for the demo. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    try:
        user_key = user.create_access_key_pair()
        print(f"Created access key pair for user.")
    except ClientError as error:
        print(
            f"Couldn't create access keys for user {user.name}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    print(f"Wait for user to be ready.", end="")
    progress_bar(10)

    try:
        role = iam_resource.create_role(
            RoleName=f"demo-role-{uuid4()}",
            AssumeRolePolicyDocument=json.dumps(
                {
                    "Version":"2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {"AWS": user.arn},
                            "Action": "sts:AssumeRole",
                        }
                    ],
                }
            ),
        )
        print(f"Created role {role.name}.")
    except ClientError as error:
        print(
            f"Couldn't create a role for the demo. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    try:
        policy = iam_resource.create_policy(
            PolicyName=f"demo-policy-{uuid4()}",
            PolicyDocument=json.dumps(
                {
                    "Version":"2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Action": "s3:ListAllMyBuckets",
                            "Resource": "arn:aws:s3:::*",
                        }
                    ],
                }
            ),
        )
        role.attach_policy(PolicyArn=policy.arn)
        print(f"Created policy {policy.policy_name} and attached it to the role.")
    except ClientError as error:
        print(
            f"Couldn't create a policy and attach it to role {role.name}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    try:
        user.create_policy(
            PolicyName=f"demo-user-policy-{uuid4()}",
            PolicyDocument=json.dumps(
                {
                    "Version":"2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Action": "sts:AssumeRole",
                            "Resource": role.arn,
                        }
                    ],
                }
            ),
        )
        print(
            f"Created an inline policy for {user.name} that lets the user assume "
            f"the role."
        )
    except ClientError as error:
        print(
            f"Couldn't create an inline policy for user {user.name}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    print("Give AWS time to propagate these new resources and connections.", end="")
    progress_bar(10)

    return user, user_key, role


def show_access_denied_without_role(user_key):
    """
    Shows that listing buckets without first assuming the role is not allowed.

    :param user_key: The key of the user created during setup. This user does not
                     have permission to list buckets in the account.
    """
    print(f"Try to list buckets without first assuming the role.")
    s3_denied_resource = boto3.resource(
        "s3", aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret
    )
    try:
        for bucket in s3_denied_resource.buckets.all():
            print(bucket.name)
        raise RuntimeError("Expected to get AccessDenied error when listing buckets!")
    except ClientError as error:
        if error.response["Error"]["Code"] == "AccessDenied":
            print("Attempt to list buckets with no permissions: AccessDenied.")
        else:
            raise


def list_buckets_from_assumed_role(user_key, assume_role_arn, session_name):
    """
    Assumes a role that grants permission to list the Amazon S3 buckets in the account.
    Uses the temporary credentials from the role to list the buckets that are owned
    by the assumed role's account.

    :param user_key: The access key of a user that has permission to assume the role.
    :param assume_role_arn: The Amazon Resource Name (ARN) of the role that
                            grants access to list the other account's buckets.
    :param session_name: The name of the STS session.
    """
    sts_client = boto3.client(
        "sts", aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret
    )
    try:
        response = sts_client.assume_role(
            RoleArn=assume_role_arn, RoleSessionName=session_name
        )
        temp_credentials = response["Credentials"]
        print(f"Assumed role {assume_role_arn} and got temporary credentials.")
    except ClientError as error:
        print(
            f"Couldn't assume role {assume_role_arn}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    # Create an S3 resource that can access the account with the temporary credentials.
    s3_resource = boto3.resource(
        "s3",
        aws_access_key_id=temp_credentials["AccessKeyId"],
        aws_secret_access_key=temp_credentials["SecretAccessKey"],
        aws_session_token=temp_credentials["SessionToken"],
    )
    print(f"Listing buckets for the assumed role's account:")
    try:
        for bucket in s3_resource.buckets.all():
            print(bucket.name)
    except ClientError as error:
        print(
            f"Couldn't list buckets for the account. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise




def teardown(user, role):
    """
    Removes all resources created during setup.

    :param user: The demo user.
    :param role: The demo role.
    """
    try:
        for attached in role.attached_policies.all():
            policy_name = attached.policy_name
            role.detach_policy(PolicyArn=attached.arn)
            attached.delete()
            print(f"Detached and deleted {policy_name}.")
        role.delete()
        print(f"Deleted {role.name}.")
    except ClientError as error:
        print(
            "Couldn't detach policy, delete policy, or delete role. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    try:
        for user_pol in user.policies.all():
            user_pol.delete()
            print("Deleted inline user policy.")
        for key in user.access_keys.all():
            key.delete()
            print("Deleted user's access key.")
        user.delete()
        print(f"Deleted {user.name}.")
    except ClientError as error:
        print(
            "Couldn't delete user policy or delete user. Here's why: "
            f"{error.response['Error']['Message']}"
        )


def usage_demo():
    """Drives the demonstration."""
    print("-" * 88)
    print(f"Welcome to the IAM create user and assume role demo.")
    print("-" * 88)
    iam_resource = boto3.resource("iam")
    user = None
    role = None
    try:
        user, user_key, role = setup(iam_resource)
        print(f"Created {user.name} and {role.name}.")
        show_access_denied_without_role(user_key)
        list_buckets_from_assumed_role(user_key, role.arn, "AssumeRoleDemoSession")
    except Exception:
        print("Something went wrong!")
    finally:
        if user is not None and role is not None:
            teardown(user, role)
        print("Thanks for watching!")


if __name__ == "__main__":
    usage_demo()
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK untuk Python (Boto3)*.
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/PutUserPolicy)

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby/example_code/iam#code-examples). 
Buat pengguna IAM dan peran yang memberikan izin untuk mencantumkan bucket Amazon S3. Pengguna hanya memiliki hak untuk mengambil peran. Setelah mengambil peran, gunakan kredensyal sementara untuk membuat daftar bucket untuk akun.  

```
# Wraps the scenario actions.
class ScenarioCreateUserAssumeRole
  attr_reader :iam_client

  # @param [Aws::IAM::Client] iam_client: The AWS IAM client.
  def initialize(iam_client, logger: Logger.new($stdout))
    @iam_client = iam_client
    @logger = logger
  end

  # Waits for the specified number of seconds.
  #
  # @param duration [Integer] The number of seconds to wait.
  def wait(duration)
    puts('Give AWS time to propagate resources...')
    sleep(duration)
  end

  # Creates a user.
  #
  # @param user_name [String] The name to give the user.
  # @return [Aws::IAM::User] The newly created user.
  def create_user(user_name)
    user = @iam_client.create_user(user_name: user_name).user
    @logger.info("Created demo user named #{user.user_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info('Tried and failed to create demo user.')
    @logger.info("\t#{e.code}: #{e.message}")
    @logger.info("\nCan't continue the demo without a user!")
    raise
  else
    user
  end

  # Creates an access key for a user.
  #
  # @param user [Aws::IAM::User] The user that owns the key.
  # @return [Aws::IAM::AccessKeyPair] The newly created access key.
  def create_access_key_pair(user)
    user_key = @iam_client.create_access_key(user_name: user.user_name).access_key
    @logger.info("Created accesskey pair for user #{user.user_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't create access keys for user #{user.user_name}.")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  else
    user_key
  end

  # Creates a role that can be assumed by a user.
  #
  # @param role_name [String] The name to give the role.
  # @param user [Aws::IAM::User] The user who is granted permission to assume the role.
  # @return [Aws::IAM::Role] The newly created role.
  def create_role(role_name, user)
    trust_policy = {
      Version: '2012-10-17',
      Statement: [{
        Effect: 'Allow',
        Principal: { 'AWS': user.arn },
        Action: 'sts:AssumeRole'
      }]
    }.to_json
    role = @iam_client.create_role(
      role_name: role_name,
      assume_role_policy_document: trust_policy
    ).role
    @logger.info("Created role #{role.role_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't create a role for the demo. Here's why: ")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  else
    role
  end

  # Creates a policy that grants permission to list S3 buckets in the account, and
  # then attaches the policy to a role.
  #
  # @param policy_name [String] The name to give the policy.
  # @param role [Aws::IAM::Role] The role that the policy is attached to.
  # @return [Aws::IAM::Policy] The newly created policy.
  def create_and_attach_role_policy(policy_name, role)
    policy_document = {
      Version: '2012-10-17',
      Statement: [{
        Effect: 'Allow',
        Action: 's3:ListAllMyBuckets',
        Resource: 'arn:aws:s3:::*'
      }]
    }.to_json
    policy = @iam_client.create_policy(
      policy_name: policy_name,
      policy_document: policy_document
    ).policy
    @iam_client.attach_role_policy(
      role_name: role.role_name,
      policy_arn: policy.arn
    )
    @logger.info("Created policy #{policy.policy_name} and attached it to role #{role.role_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't create a policy and attach it to role #{role.role_name}. Here's why: ")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  end

  # Creates an inline policy for a user that lets the user assume a role.
  #
  # @param policy_name [String] The name to give the policy.
  # @param user [Aws::IAM::User] The user that owns the policy.
  # @param role [Aws::IAM::Role] The role that can be assumed.
  # @return [Aws::IAM::UserPolicy] The newly created policy.
  def create_user_policy(policy_name, user, role)
    policy_document = {
      Version: '2012-10-17',
      Statement: [{
        Effect: 'Allow',
        Action: 'sts:AssumeRole',
        Resource: role.arn
      }]
    }.to_json
    @iam_client.put_user_policy(
      user_name: user.user_name,
      policy_name: policy_name,
      policy_document: policy_document
    )
    puts("Created an inline policy for #{user.user_name} that lets the user assume role #{role.role_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't create an inline policy for user #{user.user_name}. Here's why: ")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  end

  # Creates an Amazon S3 resource with specified credentials. This is separated into a
  # factory function so that it can be mocked for unit testing.
  #
  # @param credentials [Aws::Credentials] The credentials used by the Amazon S3 resource.
  def create_s3_resource(credentials)
    Aws::S3::Resource.new(client: Aws::S3::Client.new(credentials: credentials))
  end

  # Lists the S3 buckets for the account, using the specified Amazon S3 resource.
  # Because the resource uses credentials with limited access, it may not be able to
  # list the S3 buckets.
  #
  # @param s3_resource [Aws::S3::Resource] An Amazon S3 resource.
  def list_buckets(s3_resource)
    count = 10
    s3_resource.buckets.each do |bucket|
      @logger.info "\t#{bucket.name}"
      count -= 1
      break if count.zero?
    end
  rescue Aws::Errors::ServiceError => e
    if e.code == 'AccessDenied'
      puts('Attempt to list buckets with no permissions: AccessDenied.')
    else
      @logger.info("Couldn't list buckets for the account. Here's why: ")
      @logger.info("\t#{e.code}: #{e.message}")
      raise
    end
  end

  # Creates an AWS Security Token Service (AWS STS) client with specified credentials.
  # This is separated into a factory function so that it can be mocked for unit testing.
  #
  # @param key_id [String] The ID of the access key used by the STS client.
  # @param key_secret [String] The secret part of the access key used by the STS client.
  def create_sts_client(key_id, key_secret)
    Aws::STS::Client.new(access_key_id: key_id, secret_access_key: key_secret)
  end

  # Gets temporary credentials that can be used to assume a role.
  #
  # @param role_arn [String] The ARN of the role that is assumed when these credentials
  #                          are used.
  # @param sts_client [AWS::STS::Client] An AWS STS client.
  # @return [Aws::AssumeRoleCredentials] The credentials that can be used to assume the role.
  def assume_role(role_arn, sts_client)
    credentials = Aws::AssumeRoleCredentials.new(
      client: sts_client,
      role_arn: role_arn,
      role_session_name: 'create-use-assume-role-scenario'
    )
    @logger.info("Assumed role '#{role_arn}', got temporary credentials.")
    credentials
  end

  # Deletes a role. If the role has policies attached, they are detached and
  # deleted before the role is deleted.
  #
  # @param role_name [String] The name of the role to delete.
  def delete_role(role_name)
    @iam_client.list_attached_role_policies(role_name: role_name).attached_policies.each do |policy|
      @iam_client.detach_role_policy(role_name: role_name, policy_arn: policy.policy_arn)
      @iam_client.delete_policy(policy_arn: policy.policy_arn)
      @logger.info("Detached and deleted policy #{policy.policy_name}.")
    end
    @iam_client.delete_role({ role_name: role_name })
    @logger.info("Role deleted: #{role_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't detach policies and delete role #{role.name}. Here's why:")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  end

  # Deletes a user. If the user has inline policies or access keys, they are deleted
  # before the user is deleted.
  #
  # @param user [Aws::IAM::User] The user to delete.
  def delete_user(user_name)
    user = @iam_client.list_access_keys(user_name: user_name).access_key_metadata
    user.each do |key|
      @iam_client.delete_access_key({ access_key_id: key.access_key_id, user_name: user_name })
      @logger.info("Deleted access key #{key.access_key_id} for user '#{user_name}'.")
    end

    @iam_client.delete_user(user_name: user_name)
    @logger.info("Deleted user '#{user_name}'.")
  rescue Aws::IAM::Errors::ServiceError => e
    @logger.error("Error deleting user '#{user_name}': #{e.message}")
  end
end

# Runs the IAM create a user and assume a role scenario.
def run_scenario(scenario)
  puts('-' * 88)
  puts('Welcome to the IAM create a user and assume a role demo!')
  puts('-' * 88)
  user = scenario.create_user("doc-example-user-#{Random.uuid}")
  user_key = scenario.create_access_key_pair(user)
  scenario.wait(10)
  role = scenario.create_role("doc-example-role-#{Random.uuid}", user)
  scenario.create_and_attach_role_policy("doc-example-role-policy-#{Random.uuid}", role)
  scenario.create_user_policy("doc-example-user-policy-#{Random.uuid}", user, role)
  scenario.wait(10)
  puts('Try to list buckets with credentials for a user who has no permissions.')
  puts('Expect AccessDenied from this call.')
  scenario.list_buckets(
    scenario.create_s3_resource(Aws::Credentials.new(user_key.access_key_id, user_key.secret_access_key))
  )
  puts('Now, assume the role that grants permission.')
  temp_credentials = scenario.assume_role(
    role.arn, scenario.create_sts_client(user_key.access_key_id, user_key.secret_access_key)
  )
  puts('Here are your buckets:')
  scenario.list_buckets(scenario.create_s3_resource(temp_credentials))
  puts("Deleting role '#{role.role_name}' and attached policies.")
  scenario.delete_role(role.role_name)
  puts("Deleting user '#{user.user_name}', policies, and keys.")
  scenario.delete_user(user.user_name)
  puts('Thanks for watching!')
  puts('-' * 88)
rescue Aws::Errors::ServiceError => e
  puts('Something went wrong with the demo.')
  puts("\t#{e.code}: #{e.message}")
end

run_scenario(ScenarioCreateUserAssumeRole.new(Aws::IAM::Client.new)) if $PROGRAM_NAME == __FILE__
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK untuk Ruby *.
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/PutUserPolicy)

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1/examples/iam#code-examples). 

```
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_iam::Error as iamError;
use aws_sdk_iam::{config::Credentials as iamCredentials, config::Region, Client as iamClient};
use aws_sdk_s3::Client as s3Client;
use aws_sdk_sts::Client as stsClient;
use tokio::time::{sleep, Duration};
use uuid::Uuid;

#[tokio::main]
async fn main() -> Result<(), iamError> {
    let (client, uuid, list_all_buckets_policy_document, inline_policy_document) =
        initialize_variables().await;

    if let Err(e) = run_iam_operations(
        client,
        uuid,
        list_all_buckets_policy_document,
        inline_policy_document,
    )
    .await
    {
        println!("{:?}", e);
    };

    Ok(())
}

async fn initialize_variables() -> (iamClient, String, String, String) {
    let region_provider = RegionProviderChain::first_try(Region::new("us-west-2"));

    let shared_config = aws_config::from_env().region(region_provider).load().await;
    let client = iamClient::new(&shared_config);
    let uuid = Uuid::new_v4().to_string();

    let list_all_buckets_policy_document = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"s3:ListAllMyBuckets\",
                    \"Resource\": \"arn:aws:s3:::*\"}]
    }"
    .to_string();
    let inline_policy_document = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"sts:AssumeRole\",
                    \"Resource\": \"{}\"}]
    }"
    .to_string();

    (
        client,
        uuid,
        list_all_buckets_policy_document,
        inline_policy_document,
    )
}

async fn run_iam_operations(
    client: iamClient,
    uuid: String,
    list_all_buckets_policy_document: String,
    inline_policy_document: String,
) -> Result<(), iamError> {
    let user = iam_service::create_user(&client, &format!("{}{}", "iam_demo_user_", uuid)).await?;
    println!("Created the user with the name: {}", user.user_name());
    let key = iam_service::create_access_key(&client, user.user_name()).await?;

    let assume_role_policy_document = "{
        \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Principal\": {\"AWS\": \"{}\"},
                    \"Action\": \"sts:AssumeRole\"
                }]
            }"
    .to_string()
    .replace("{}", user.arn());

    let assume_role_role = iam_service::create_role(
        &client,
        &format!("{}{}", "iam_demo_role_", uuid),
        &assume_role_policy_document,
    )
    .await?;
    println!("Created the role with the ARN: {}", assume_role_role.arn());

    let list_all_buckets_policy = iam_service::create_policy(
        &client,
        &format!("{}{}", "iam_demo_policy_", uuid),
        &list_all_buckets_policy_document,
    )
    .await?;
    println!(
        "Created policy: {}",
        list_all_buckets_policy.policy_name.as_ref().unwrap()
    );

    let attach_role_policy_result =
        iam_service::attach_role_policy(&client, &assume_role_role, &list_all_buckets_policy)
            .await?;
    println!(
        "Attached the policy to the role: {:?}",
        attach_role_policy_result
    );

    let inline_policy_name = format!("{}{}", "iam_demo_inline_policy_", uuid);
    let inline_policy_document = inline_policy_document.replace("{}", assume_role_role.arn());
    iam_service::create_user_policy(&client, &user, &inline_policy_name, &inline_policy_document)
        .await?;
    println!("Created inline policy.");

    //First, fail to list the buckets with the user.
    let creds = iamCredentials::from_keys(key.access_key_id(), key.secret_access_key(), None);
    let fail_config = aws_config::from_env()
        .credentials_provider(creds.clone())
        .load()
        .await;
    println!("Fail config: {:?}", fail_config);
    let fail_client: s3Client = s3Client::new(&fail_config);
    match fail_client.list_buckets().send().await {
        Ok(e) => {
            println!("This should not run. {:?}", e);
        }
        Err(e) => {
            println!("Successfully failed with error: {:?}", e)
        }
    }

    let sts_config = aws_config::from_env()
        .credentials_provider(creds.clone())
        .load()
        .await;
    let sts_client: stsClient = stsClient::new(&sts_config);
    sleep(Duration::from_secs(10)).await;
    let assumed_role = sts_client
        .assume_role()
        .role_arn(assume_role_role.arn())
        .role_session_name(format!("iam_demo_assumerole_session_{uuid}"))
        .send()
        .await;
    println!("Assumed role: {:?}", assumed_role);
    sleep(Duration::from_secs(10)).await;

    let assumed_credentials = iamCredentials::from_keys(
        assumed_role
            .as_ref()
            .unwrap()
            .credentials
            .as_ref()
            .unwrap()
            .access_key_id(),
        assumed_role
            .as_ref()
            .unwrap()
            .credentials
            .as_ref()
            .unwrap()
            .secret_access_key(),
        Some(
            assumed_role
                .as_ref()
                .unwrap()
                .credentials
                .as_ref()
                .unwrap()
                .session_token
                .clone(),
        ),
    );

    let succeed_config = aws_config::from_env()
        .credentials_provider(assumed_credentials)
        .load()
        .await;
    println!("succeed config: {:?}", succeed_config);
    let succeed_client: s3Client = s3Client::new(&succeed_config);
    sleep(Duration::from_secs(10)).await;
    match succeed_client.list_buckets().send().await {
        Ok(_) => {
            println!("This should now run successfully.")
        }
        Err(e) => {
            println!("This should not run. {:?}", e);
            panic!()
        }
    }

    //Clean up.
    iam_service::detach_role_policy(
        &client,
        assume_role_role.role_name(),
        list_all_buckets_policy.arn().unwrap_or_default(),
    )
    .await?;
    iam_service::delete_policy(&client, list_all_buckets_policy).await?;
    iam_service::delete_role(&client, &assume_role_role).await?;
    println!("Deleted role {}", assume_role_role.role_name());
    iam_service::delete_access_key(&client, &user, &key).await?;
    println!("Deleted key for {}", key.user_name());
    iam_service::delete_user_policy(&client, &user, &inline_policy_name).await?;
    println!("Deleted inline user policy: {}", inline_policy_name);
    iam_service::delete_user(&client, &user).await?;
    println!("Deleted user {}", user.user_name());

    Ok(())
}
```
+ Untuk detail API, lihat topik berikut di *Referensi API AWS SDK for Rust*.
  + [AttachRolePolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.attach_role_policy)
  + [CreateAccessKey](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.create_access_key)
  + [CreatePolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.create_policy)
  + [CreateRole](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.create_role)
  + [CreateUser](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.create_user)
  + [DeleteAccessKey](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_access_key)
  + [DeletePolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_policy)
  + [DeleteRole](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_role)
  + [DeleteUser](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_user)
  + [DeleteUserPolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_user_policy)
  + [DetachRolePolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.detach_role_policy)
  + [PutUserPolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.put_user_policy)

------

# Menggunakan peran IAM untuk memberikan izin ke aplikasi yang berjalan di instans Amazon EC2
<a name="id_roles_use_switch-role-ec2"></a>

Aplikasi yang berjalan pada instans Amazon EC2 harus menyertakan AWS kredensional dalam permintaan API. AWS Anda dapat meminta pengembang menyimpan AWS kredensitas langsung dalam instans Amazon EC2 dan mengizinkan aplikasi dalam hal itu untuk menggunakan kredenal tersebut. Tetapi pengembang kemudian harus mengelola kredensil dan memastikan bahwa mereka meneruskan kredensil dengan aman ke setiap instance dan memperbarui setiap instans Amazon EC2 ketika saatnya untuk memperbarui kredensialnya. Banyak pekerjaan tambahan.

Sebagai gantinya, Anda dapat dan harus menggunakan peran IAM untuk mengelola kredenal *sementara* untuk aplikasi yang berjalan pada instans Amazon EC2. Bila Anda menggunakan peran, Anda tidak perlu mendistribusikan kredenal jangka panjang (seperti kredenal masuk atau kunci akses) ke instans Amazon EC2. Sebagai gantinya, peran menyediakan izin sementara yang dapat digunakan aplikasi saat mereka melakukan panggilan ke AWS sumber daya lain. Saat meluncurkan instans Amazon EC2, Anda menentukan peran IAM untuk diasosiasikan dengan instans. Aplikasi yang berjalan pada instans kemudian dapat menggunakan kredensial sementara yang diberikan oleh peran untuk menandatangani permintaan API.

Menggunakan peran untuk memberikan izin ke aplikasi yang berjalan di instans Amazon EC2 memerlukan sedikit konfigurasi tambahan. Aplikasi yang berjalan pada instans Amazon EC2 diabstraksikan AWS oleh sistem operasi tervirtualisasi. Karena pemisahan ekstra ini, Anda memerlukan langkah tambahan untuk menetapkan AWS peran dan izin terkait ke instans Amazon EC2 dan membuatnya tersedia untuk aplikasinya. Langkah ekstra ini adalah pembuatan *[profil instance](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)* yang dilampirkan ke instance. Profil instans berisi peran dan dapat memberikan kredensial sementara peran ke aplikasi yang berjalan pada instans. Kredensial sementara tersebut kemudian dapat digunakan dalam panggilan API aplikasi untuk mengakses sumber daya dan membatasi akses ke sumber daya yang ditentukan oleh peran tersebut saja.

**catatan**  
Hanya satu peran yang dapat ditetapkan ke instans Amazon EC2 sekaligus, dan semua aplikasi pada instans memiliki peran dan izin yang sama. Saat memanfaatkan Amazon ECS untuk mengelola instans Amazon EC2, Anda dapat menetapkan peran ke tugas Amazon ECS yang dapat dibedakan dari peran instans Amazon EC2 yang dijalankannya. Menetapkan setiap tugas peran selaras dengan prinsip akses yang paling tidak memiliki hak istimewa dan memungkinkan kontrol terperinci yang lebih besar atas tindakan dan sumber daya.  
Untuk informasi selengkapnya, lihat [Menggunakan peran IAM dengan tugas Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/security-iam-roles.html) di Panduan *Praktik Terbaik Amazon Elastic Container Service*.

Penggunaan peran dengan cara ini memiliki beberapa keuntungan. Karena kredensi peran bersifat sementara dan diperbarui secara otomatis, Anda tidak perlu mengelola kredensi, dan Anda tidak perlu khawatir tentang risiko keamanan jangka panjang. Selain itu, jika Anda menggunakan satu peran untuk beberapa instance, Anda dapat membuat perubahan pada satu peran tersebut dan perubahan tersebut menyebar secara otomatis ke semua instance. 

**catatan**  
Meskipun peran biasanya ditetapkan ke instans Amazon EC2 saat Anda meluncurkannya, peran juga dapat dilampirkan ke instans Amazon EC2 yang sedang berjalan. Untuk mempelajar cara melampirkan peran pada instans yang sedang berjalan, lihat [Peran IAM untuk Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role).

**Topics**
+ [Bagaimana cara kerja peran untuk instans Amazon EC2?](#roles-usingrole-ec2instance-roles)
+ [Izin yang diperlukan untuk menggunakan peran dengan Amazon EC2](#roles-usingrole-ec2instance-permissions)
+ [Bagaimana saya memulainya?](#roles-usingrole-ec2instance-get-started)
+ [Informasi Terkait](#roles-usingrole-ec2instance-related-info)

## Bagaimana cara kerja peran untuk instans Amazon EC2?
<a name="roles-usingrole-ec2instance-roles"></a>

Pada gambar berikut, pengembang menjalankan aplikasi pada instans Amazon EC2 yang memerlukan akses ke bucket S3 bernama. `amzn-s3-demo-bucket-photos` Administrator membuat peran `Get-pics` layanan dan melampirkan peran tersebut ke instans Amazon EC2. Peran ini mencakup kebijakan izin yang memberikan akses hanya-baca ke bucket S3 tertentu. Ini juga mencakup kebijakan kepercayaan yang memungkinkan instans Amazon EC2 untuk mengambil peran dan mengambil kredensi sementara. Saat aplikasi berjalan pada instans, itu menggunakan kredensial sementara peran untuk mengakses bucket foto. Administrator tidak perlu memberikan izin kepada developer untuk mengakses bucket foto, dan developer tidak perlu membagikan atau mengelola kredensial.

![\[Aplikasi pada instans Amazon EC2 yang mengakses sumber daya AWS\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/roles-usingrole-ec2roleinstance.png)


1. Administrator menggunakan IAM untuk membuat peran **Get-pics**. Dalam kebijakan kepercayaan peran, administrator menetapkan bahwa hanya instans Amazon EC2 yang dapat mengambil peran tersebut. Dalam kebijakan izin peran, administrator menentukan izin hanya-baca untuk bucket `amzn-s3-demo-bucket-photos`.

1. Pengembang meluncurkan instans Amazon EC2 dan menetapkan peran `Get-pics` tersebut ke instance tersebut.
**catatan**  
Jika Anda menggunakan konsol IAM, profil instans dikelola untuk Anda dan sebagian besar transparan bagi Anda. Namun, jika Anda menggunakan API AWS CLI atau untuk membuat dan mengelola peran dan instans Amazon EC2, Anda harus membuat profil instans dan menetapkan peran tersebut sebagai langkah terpisah. Kemudian, saat Anda meluncurkan instans, Anda harus menentukan nama profil instans dan bukan nama peran.

1. Saat aplikasi berjalan, itu mendapatkan kredensial keamanan sementara dari [metadata instans](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) Amazon EC2, sebagaimana dijelaskan dalam [Mengambil Kredensial Keamanan dari Metadata Instans](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials). Ini adalah [kredensial keamanan sementara](id_credentials_temp.md) yang mewakili peran tersebut dan berlaku untuk periode waktu yang terbatas. 

   Dengan beberapa [AWS SDKs](https://aws.amazon.com/tools/), pengembang dapat menggunakan penyedia yang mengelola kredenal keamanan sementara secara transparan. (Dokumentasi untuk individu AWS SDKs menjelaskan fitur yang didukung oleh SDK tersebut untuk mengelola kredensional.)

   Atau, aplikasi bisa mendapatkan kredensi sementara langsung dari metadata instance instans Amazon EC2. Kredensial dan nilai terkait tersedia dari kategori `iam/security-credentials/role-name` (dalam hal ini, `iam/security-credentials/Get-pics`) metadata. Jika aplikasi mendapatkan kredensial dari metadata instans, itu dapat menyimpan kredensial tersebut.

1. Dengan menggunakan kredensial sementara yang diambil, aplikasi mengakses bucket foto. Karena kebijakan terlampir pada peran **Get-pics**, aplikasi memiliki izin hanya-baca. 

   Kredensi keamanan sementara yang tersedia pada instans secara otomatis diperbarui sebelum kedaluwarsa sehingga set yang valid selalu tersedia. Aplikasi hanya perlu memastikan bahwa itu mendapatkan serangkaian kredensial baru dari metadata instans sebelum metadata yang sedang digunakan kedaluwarsa. Dimungkinkan untuk menggunakan AWS SDK untuk mengelola kredensional sehingga aplikasi tidak perlu menyertakan logika tambahan untuk menyegarkan kredensialnya. Misalnya, membuat instan klien dengan Penyedia Kredensial Profil Instans. Namun, jika aplikasi mendapatkan kredensial keamanan sementara dari metadata instans dan sudah menyimpannya, itu akan mendapatkan rangkaian kredensial yang diperbarui setiap jam, atau setidaknya 15 menit sebelum rangkaian yang sedang digunakan kedaluwarsa. Waktu kedaluwarsa termasuk dalam informasi yang dikembalikan dalam kategori. `iam/security-credentials/role-name` 

## Izin yang diperlukan untuk menggunakan peran dengan Amazon EC2
<a name="roles-usingrole-ec2instance-permissions"></a>

Untuk meluncurkan instance dengan peran, pengembang harus memiliki izin untuk meluncurkan instans Amazon EC2 dan izin untuk meneruskan peran IAM.

Kebijakan contoh berikut memungkinkan pengguna untuk menggunakan Konsol Manajemen AWS untuk meluncurkan instance dengan peran. Kebijakan ini mencakup wildcard (`*`) untuk memungkinkan pengguna meneruskan peran apa pun dan melakukan tindakan Amazon EC2 yang terdaftar. `ListInstanceProfiles`Tindakan ini memungkinkan pengguna untuk melihat semua peran yang tersedia di Akun AWS.

**Example Contoh kebijakan yang memberikan izin kepada pengguna untuk menggunakan konsol Amazon EC2 untuk meluncurkan instans dengan peran.**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "IamPassRole",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "ec2.amazonaws.com"
                }
            }
        },
        {
            "Sid": "ListEc2AndListInstanceProfiles",
            "Effect": "Allow",
            "Action": [
                "iam:ListInstanceProfiles",
                "ec2:Describe*",
                "ec2:Search*",
                "ec2:Get*"
            ],
            "Resource": "*"
        }
    ]
}
```

### Membatasi peran mana yang dapat diteruskan ke instans Amazon EC2 (menggunakan) PassRole
<a name="roles-usingrole-ec2instance-passrole"></a>

Anda dapat menggunakan `PassRole` izin untuk membatasi peran mana yang dapat diteruskan pengguna ke instans Amazon EC2 saat pengguna meluncurkan instance. Ini membantu mencegah pengguna menjalankan aplikasi yang memiliki izin lebih dari yang diberikan kepada pengguna—yaitu, agar dapat memperoleh hak istimewa yang ditingkatkan. Misalnya, bayangkan pengguna Alice hanya memiliki izin untuk meluncurkan instans Amazon EC2 dan bekerja dengan bucket Amazon S3, tetapi peran yang diteruskannya ke instans Amazon EC2 memiliki izin untuk bekerja dengan IAM dan Amazon DynamoDB. Dalam hal ini, Alice mungkin dapat meluncurkan instance, masuk ke dalamnya, mendapatkan kredensi keamanan sementara, dan kemudian melakukan tindakan IAM atau DynamoDB yang tidak dia otorisasi.

Untuk membatasi peran mana yang dapat diteruskan pengguna ke instans Amazon EC2, Anda membuat kebijakan yang mengizinkan `PassRole` tindakan tersebut. Anda kemudian melampirkan kebijakan ke pengguna (atau ke grup IAM milik pengguna) yang akan meluncurkan instans Amazon EC2. Di `Resource` elemen kebijakan, Anda mencantumkan peran atau peran yang diizinkan diteruskan pengguna ke instans Amazon EC2. Saat pengguna meluncurkan suatu instans dan mengaitkan peran dengannya, Amazon EC2 akan memeriksa apakah pengguna diizinkan untuk meneruskan peran tersebut. Tentu saja, Anda juga harus memastikan bahwa peran yang dapat diteruskan oleh pengguna tidak mencakup lebih banyak izin dari yang seharusnya dimiliki oleh pengguna.

**catatan**  
`PassRole` bukan merupakan tindakan API dengan cara yang sama seperti `RunInstances` atau `ListInstanceProfiles`. Sebagai gantinya, ini adalah izin yang AWS memeriksa setiap kali peran ARN diteruskan sebagai parameter ke API (atau konsol melakukan ini atas nama pengguna). Itu membantu administrator untuk mengontrol peran mana yang dapat diteruskan oleh pengguna yang mana. Dalam kasus ini, itu memastikan bahwa pengguna diizinkan untuk melampirkan peran tertentu ke instans Amazon EC2.

**Example Contoh kebijakan yang memberikan izin kepada pengguna untuk meluncurkan instans Amazon EC2 dengan peran tertentu**  
Kebijakan sampel berikut memungkinkan pengguna untuk menggunakan Amazon EC2 API untuk meluncurkan instans dengan peran. Elemen `Resource` menentukan Amazon Resource Name (ARN) dari peran. Dengan menentukan ARN, kebijakan memberi izin kepada pengguna untuk hanya meneruskan peran `Get-pics`. Jika pengguna mencoba menentukan peran yang berbeda saat meluncurkan suatu instans, tindakan tersebut gagal. Pengguna memang memiliki izin untuk menjalankan setiap instans, terlepas dari apakah mereka meneruskan suatu peran.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/Get-pics"
        }
    ]
}
```

### Memungkinkan peran profil instans untuk beralih ke peran dalam akun lain
<a name="switch-role-ec2-another-account"></a>

Anda dapat mengizinkan aplikasi yang berjalan di instans Amazon EC2 untuk menjalankan perintah di akun lain. Untuk melakukan ini, Anda harus mengizinkan peran instans Amazon EC2 di akun pertama untuk beralih ke peran di akun kedua.

Bayangkan Anda menggunakan dua Akun AWS dan Anda ingin mengizinkan aplikasi yang berjalan pada instans Amazon EC2 untuk menjalankan [AWS CLI](https://aws.amazon.com/cli/)perintah di kedua akun. Asumsikan bahwa instans Amazon EC2 ada di akun. `111111111111` Instance tersebut menyertakan peran profil `abcd` instance yang memungkinkan aplikasi melakukan tugas Amazon S3 hanya-baca di bucket dalam akun `amzn-s3-demo-bucket1` yang sama. `111111111111` Namun demikian, aplikasi tersebut juga harus diizinkan untuk menjalankan `efgh` peran lintas akun untuk mengakses `amzn-s3-demo-bucket2` bucket Amazon S3 dalam akun `222222222222`.

![\[Diagram menunjukkan bagaimana pengembang meluncurkan instans Amazon EC2 dengan peran untuk mendapatkan akses ke foto di bucket Amazon S3.\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/images/roles-instance-profile-cross-account.png)


Peran profil instans `abcd` Amazon EC2 harus memiliki kebijakan izin berikut untuk mengizinkan aplikasi mengakses bucket Amazon S3`amzn-s3-demo-bucket1`:

***Akun 111111111111 Kebijakan `abcd` Izin Peran***

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1/*",
                "arn:aws:s3:::amzn-s3-demo-bucket1"
            ]
        },
        {
            "Sid": "AllowIPToAssumeCrossAccountRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::222222222222:role/efgh"
        }
    ]
}
```

------

Peran `abcd` harus mempercayai layanan Amazon EC2 untuk menjalankan peran tersebut. Untuk melakukannya, peran `abcd` harus memiliki kebijakan kepercayaan berikut:

***Akun 111111111111 Kebijakan `abcd` Kepercayaan Peran***

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "abcdTrustPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"Service": "ec2.amazonaws.com"}
        }
    ]
}
```

------

Anggap bahwa peran lintas akun `efgh` memungkinkan tugas Amazon S3 hanya baca di bucket `amzn-s3-demo-bucket2` dalam akun `222222222222` yang sama. Untuk melakukannya, peran lintas akun `efgh` harus memiliki kebijakan izin berikut:

***Akun 222222222222 Kebijakan `efgh` Izin Peran***

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket2/*",
                "arn:aws:s3:::amzn-s3-demo-bucket2"
            ]
        }
    ]
}
```

------

Peran `efgh` harus mempercayai profil instans `abcd` untuk menjalankannya. Untuk melakukannya, peran `efgh` harus memiliki kebijakan kepercayaan berikut:

***Akun 222222222222 Kebijakan `efgh` Kepercayaan Peran***

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "efghTrustPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"}
        }
    ]
}
```

------

## Bagaimana saya memulainya?
<a name="roles-usingrole-ec2instance-get-started"></a>

Untuk memahami cara kerja peran dengan instans Amazon EC2, Anda perlu menggunakan konsol IAM untuk membuat peran, meluncurkan instans Amazon EC2 yang menggunakan peran tersebut, lalu memeriksa instance yang sedang berjalan. Anda dapat menguji [metadata instans](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) untuk melihat bagaimana kredensial sementara peran tersedia untuk sebuah instans. Anda juga dapat melihat bagaimana aplikasi yang berjalan pada suatu instans dapat menggunakan peran tersebut. Gunakan sumber daya berikut ini untuk mempelajari lebih banyak. 
+ [Peran IAM di Tutorial Instans Amazon EC2](https://www.youtube.com/watch?v=TlCuOjviOhk). Video tertaut menunjukkan cara menggunakan peran IAM dengan instans Amazon EC2 untuk mengontrol apa yang dapat dilakukan aplikasi saat dijalankan pada instance. Video menunjukkan bagaimana aplikasi (ditulis dalam AWS SDK) bisa mendapatkan kredensi keamanan sementara melalui peran. 
+ Penelusuran SDK. Dokumentasi AWS SDK menyertakan penelusuran yang menunjukkan aplikasi yang berjalan pada instans Amazon EC2 yang menggunakan kredensi sementara untuk peran guna membaca bucket Amazon S3. Setiap penelusuran berikut menyajikan langkah serupa dengan bahasa pemrograman yang berbeda:
  + [Konfigurasikan Peran IAM untuk Amazon EC2 dengan SDK for Java di](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html) *Panduan Pengembang AWS SDK untuk Java * 
  + [Luncurkan Instans Amazon EC2 menggunakan SDK for .NET di](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/run-instance.html) *Panduan Pengembang AWS SDK untuk .NET *
  + [Membuat Instans Amazon EC2 dengan SDK for Ruby di](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/ec2-example-create-instance.html) *Panduan Pengembang AWS SDK untuk Ruby *

## Informasi Terkait
<a name="roles-usingrole-ec2instance-related-info"></a>

Untuk informasi selengkapnya tentang membuat peran atau peran untuk instans Amazon EC2, lihat informasi berikut:
+ Untuk informasi selengkapnya tentang [penggunaan peran IAM dengan instans Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html), buka Panduan Pengguna Amazon *EC2*.
+ Untuk membuat peran, lihat [Pembuatan peran IAM](id_roles_create.md)
+ Untuk informasi lebih lanjut tentang membuat kredensial keamanan sementara, lihat [Kredensial keamanan sementara di IAM](id_credentials_temp.md).
+ Jika Anda bekerja dengan IAM API atau CLI, Anda harus membuat dan mengelola profil instans IAM. Untuk informasi selengkapnya tentang profil instans, lihat [Gunakan profil contoh](id_roles_use_switch-role-ec2_instance-profiles.md).
+ *Untuk informasi selengkapnya tentang kredensil keamanan sementara untuk peran dalam metadata instans, lihat [Mengambil Kredensil Keamanan dari Metadata Instans di Panduan Pengguna Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials).*

# Gunakan profil contoh
<a name="id_roles_use_switch-role-ec2_instance-profiles"></a>

Gunakan profil instans untuk meneruskan peran IAM ke instans EC2. Untuk informasi selengkapnya, lihat [peran IAM untuk Amazon](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) EC2 di Panduan Pengguna *Amazon EC2*.

## Mengelola profil instans (konsol)
<a name="instance-profiles-manage-console"></a>

Jika Anda menggunakan Konsol Manajemen AWS untuk membuat peran Amazon EC2, konsol akan secara otomatis membuat profil instans dan memberinya nama yang sama dengan peran tersebut. Ketika Anda kemudian menggunakan konsol Amazon EC2 untuk meluncurkan suatu instans dengan peran IAM, Anda dapat memilih peran untuk dikaitkan dengan isntans. Dalam konsol, daftar yang ditampilkan sebenarnya adalah daftar nama profil instance. Konsol tidak membuat profil instans untuk peran yang tidak terkait dengan Amazon EC2.

Anda dapat menggunakan Konsol Manajemen AWS untuk menghapus peran IAM dan profil instans untuk Amazon EC2 jika peran dan profil instans memiliki nama yang sama. Untuk mempelajari selengkapnya tentang menghapus profil instans, lihat [Hapus peran atau profil contoh](id_roles_manage_delete.md).

**catatan**  
Untuk memperbarui izin untuk sebuah instance, ganti profil instance-nya. Kami tidak menyarankan untuk menghapus peran dari profil instance, karena ada penundaan hingga satu jam sebelum perubahan ini berlaku.

## Mengelola profil instans (AWS CLI atau AWS API)
<a name="instance-profiles-manage-cli-api"></a>

Jika Anda mengelola peran Anda dari AWS CLI atau AWS API, Anda membuat peran dan profil instance sebagai tindakan terpisah. Karena peran dan profil instans dapat memiliki nama yang berbeda, Anda harus mengetahui nama profil instans Anda serta nama peran yang dimuat olehnya. Dengan begitu Anda dapat memilih profil instans yang benar saat Anda meluncurkan instans EC2. 

Anda dapat melampirkan tag ke sumber daya IAM Anda, termasuk profil instans, untuk mengidentifikasi, mengatur, dan mengontrol akses ke mereka. Anda dapat menandai profil instance hanya ketika Anda menggunakan AWS CLI atau AWS API. 

**catatan**  
Profil instans hanya dapat berisi satu peran IAM, meskipun peran dapat dimasukkan dalam beberapa profil instans. Batasan satu peran per profil instans ini tidak dapat ditingkatkan. Anda dapat menghapus peran yang ada dan kemudian menambahkan peran yang berbeda ke profil instans. Anda kemudian harus menunggu perubahan muncul di semua AWS karena [konsistensi akhirnya](https://en.wikipedia.org/wiki/Eventual_consistency). Untuk memaksa perubahan, Anda harus [memisahkan profil instans](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html) dan kemudian [mengaitkan profil instans](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html), atau Anda dapat menghentikan instance Anda lalu memulainya ulang.

### Mengelola profil instans (AWS CLI)
<a name="instance-profiles-manage-cli"></a>

Anda dapat menggunakan AWS CLI perintah berikut untuk bekerja dengan profil instans di AWS akun. 
+ Buat profil instans: [https://docs.aws.amazon.com/cli/latest/reference/iam/create-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-instance-profile.html)
+ Tandai profil instans: [https://docs.aws.amazon.com/cli/latest/reference/iam/tag-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-instance-profile.html)
+ Cantumkan tanda untuk profil instans: [https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profile-tags.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profile-tags.html)
+ Hapus tanda profil instans: [https://docs.aws.amazon.com/cli/latest/reference/iam/untag-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-instance-profile.html)
+ Tambahkan peran ke profil instans: [https://docs.aws.amazon.com/cli/latest/reference/iam/add-role-to-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/add-role-to-instance-profile.html) 
+ Buat daftar profil instans: [https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles.html), [https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles-for-role.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles-for-role.html) 
+ Dapatkan informasi tentang profil instans: [https://docs.aws.amazon.com/cli/latest/reference/iam/get-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-instance-profile.html) 
+ Hapus peran dari profil instans: [https://docs.aws.amazon.com/cli/latest/reference/iam/remove-role-from-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/remove-role-from-instance-profile.html)
+ Hapus profil instans: [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-instance-profile.html) 

Anda juga dapat melampirkan peran ke instans EC2 yang sudah berjalan dengan menggunakan perintah berikut. Untuk informasi lebih lanjut, lihat [Peran IAM untuk Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role).
+ Lampirkan profil instans dengan peran ke instans EC2 yang dihentikan atau sedang berjalan: [https://docs.aws.amazon.com/cli/latest/reference/ec2/associate-iam-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/associate-iam-instance-profile.html) 
+ Dapatkan informasi tentang profil instans yang terlampir pada instans EC2: [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-iam-instance-profile-associations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-iam-instance-profile-associations.html) 
+ Lepas profil instans dengan peran dari instans EC2 yang dihentikan atau sedang berjalan: [https://docs.aws.amazon.com/cli/latest/reference/ec2/disassociate-iam-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/disassociate-iam-instance-profile.html) 

### Mengelola profil instance (AWS API)
<a name="instance-profiles-manage-api"></a>

Anda dapat memanggil operasi AWS API berikut untuk bekerja dengan profil instance di file Akun AWS.
+ Buat profil instans: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html) 
+ Tandai profil instans: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html) 
+ Cantumkan tanda di profil instans: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html) 
+ Hapus tanda profil instans: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html) 
+ Tambahkan peran ke profil instans: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddRoleToInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddRoleToInstanceProfile.html) 
+ Buat daftar profil instans: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfiles.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfiles.html), [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfilesForRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfilesForRole.html) 
+ Dapatkan informasi tentang profil instans: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetInstanceProfile.html) 
+ Hapus peran dari profil instans: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html) 
+ Hapus profil instans: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html) 

Anda juga dapat melampirkan peran ke instans EC2 yang sudah berjalan dengan memanggil operasi berikut ini. Untuk informasi lebih lanjut, lihat [Peran IAM untuk Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role).
+ Lampirkan profil instans dengan peran ke instans EC2 yang dihentikan atau sedang berjalan: [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html) 
+ Dapatkan informasi tentang profil instans yang terlampir pada instans EC2: [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIamInstanceProfileAssociations.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIamInstanceProfileAssociations.html) 
+ Lepas profil instans dengan peran dari instans EC2 yang dihentikan atau sedang berjalan: [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html) 