

# IAM ロール
<a name="id_roles"></a>

IAM *ロール*は、特定の許可があり、アカウントで作成できるもう 1 つの IAM アイデンティティです。IAM ロールは、アイデンティティが AWS で実行できることとできないことを決定するアクセス許可ポリシーを持つ AWS アイデンティティであるという点で IAM ユーザーと似ています。ただし、ユーザーは 1 人の特定の人に一意に関連付けられますが、ロールはそれを必要とする任意の人が引き受けるようになっています。また、ロールには標準の長期認証情報 (パスワードやアクセスキーなど) も関連付けられません。代わりに、ロールを引き受けると、ロールセッション用の一時的なセキュリティ認証情報が提供されます。

ロールを使用して、通常は AWS リソースへのアクセス権のないユーザー、アプリケーション、サービスにそのアクセス権を委任できます。例えば、AWS アカウントのユーザーに、通常はないリソースに対するアクセス許可を付与したり、ある AWS アカウント のユーザーに、別のアカウントのリソースに対するアクセス許可を付与したりできます。または、モバイルアプリに AWS リソースの使用を許可しても、(キーの更新が困難であり、ユーザーがキーの抽出を行える可能性がある) アプリへの AWS キーの埋め込みは禁止すべきである場合があります。AWS の外部 (社内ディレクトリなど) に ID をすでに持っているユーザーに AWS へのアクセスを許可することが必要になる場合があります。または、リソースを監査できるように、アカウントへのアクセス権を第三者に付与することが必要になる場合もあります。

これらのシナリオでは、*IAM ロール*を使用して AWS リソースにアクセスを委任できます。このセクションでは、ロールの概要とさまざまな使用方法、適切なアプローチを選択するタイミングと方法、ロールの作成、管理、切り替え（または引き受け）、削除を行う方法について説明します。

**注記**  
AWS アカウント を初めて作成するとき、デフォルトではロールは作成されません。アカウントにサービスを追加すると、そのユースケースをサポートするためにサービスにリンクされたロールが追加される場合があります。  
 サービスにリンクされたロールは、AWS のサービス にリンクされているサービスロールの一種です。サービスがロールを引き受け、ユーザーに代わってアクションを実行できるようになります。サービスにリンクされたロールは、AWS アカウント に表示され、サービスによって所有されます。IAM 管理者は、サービスリンクロールのアクセス許可を表示できますが、編集することはできません。  
サービスにリンクされたロールを削除する前に、最初に関連するリソースを削除する必要があります。これにより、リソースにアクセスするための許可を意図せず削除することが防止され、 リソースが保護されます。  
サービスにリンクされたロールを使用してサポートするサービスについては、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照し、**[サービスにリンクされたロール]** 列が **[はい]** になっているサービスを検索してください。サービスリンクロールに関するドキュメントをサービスで表示するには、リンクで **[はい]** を選択します。

**Topics**
+ [

## IAM ユーザーの作成が適している場合 (ロールではなく)
](#id_which-to-choose)
+ [

## ロールに関する用語と概念
](#id_roles_terms-and-concepts)
+ [

## その他のリソース
](#id_roles_additional-resources)
+ [

# 混乱する代理問題
](confused-deputy.md)
+ [

# IAM ロールによく見られるシナリオ
](id_roles_common-scenarios.md)
+ [

# IAM ロールの作成
](id_roles_create.md)
+ [

# IAM ロールの管理
](id_roles_manage.md)
+ [

# ロールを引き受けるための各種方法
](id_roles_manage-assume.md)

## IAM ユーザーの作成が適している場合 (ロールではなく)
<a name="id_which-to-choose"></a>

IAM ユーザーは、ID フェデレーションによってサポートされていないユースケースにのみ使用することをお勧めします。ユースケースには次のようなものがあります。
+ **IAM ロールを使用できないワークロード** – AWS へのアクセスが必要な場所から、ワークロードを実行する場合があります。状況によっては、IAM ロールを使用して WordPress プラグインなどに対して一時的な認証情報を提供することができない場合もあります。このような状況では、そのワークロードに対して IAM ユーザーの長期的なアクセスキーを使用して、AWS への認証を行います。
+ **サードパーティー AWS クライアント** – IAM Identity Center を使用したアクセスがサポートされていないツール (AWS でホストされていないサードパーティー AWS クライアントまたはベンダーなど) を使用している場合 は、IAM ユーザーの長期的なアクセスキーを使用します。
+ **AWS CodeCommit アクセス** — CodeCommit を使用してコードを保存している場合、CodeCommit の SSH キーまたはサービス固有の認証情報を持つ IAM ユーザーを使用して、リポジトリへの認証を行うことができます。通常の認証に IAM Identity Center のユーザーを使用することに加えて、これを行うことをお勧めします。IAM Identity Center のユーザーとは、お客様の AWS アカウント またはクラウドアプリケーションにアクセスする必要がある従業員のことです。IAM ユーザーを設定せずに CodeCommit リポジトリへのアクセス許可をユーザーに付与するには、**git-remote-codecommit** ユーティリティを設定します。IAM および CodeCommit の詳細については、「[CodeCommit の IAM 認証情報: Git 認証情報、SSH キー、および AWS アクセス キー](id_credentials_ssh-keys.md)」を参照してください。**git-remote-codecommit** ユーティリティの設定についての詳細は、*AWS CodeCommit ユーザーガイド*の「[認証情報のローテーションを使用した AWS CodeCommit リポジトリへの接続](https://docs.aws.amazon.com/codecommit/latest/userguide/temporary-access.html#temporary-access-configure-credentials)」を参照してください。
+ **Amazon Keyspaces (Apache Cassandra 向け) へのアクセス** – IAM Identity Center 内のユーザーを使用できない状況 (Cassandra との互換性をテストする場合など) では、サービス専用の認証情報を持つ IAM ユーザーを使用して Amazon Keyspaces で認証できます。IAM Identity Center のユーザーとは、お客様の AWS アカウント またはクラウドアプリケーションにアクセスする必要がある従業員のことです。一時的な認証情報を使用して Amazon Keyspaces に接続することもできます。詳細については、「*Amazon Keyspaces (Apache Cassandra 向け) デベロッパーガイド*」の「[一時的な認証情報を使用して IAM ロールと SigV4 プラグインを使用して Amazon Keyspaces に接続する](https://docs.aws.amazon.com/keyspaces/latest/devguide/access.credentials.html#temporary.credentials.IAM)」を参照してください。
+ **緊急アクセス** — ID プロバイダーにアクセスできない状況で、AWS アカウント のアクションを実行する必要がある場合。緊急アクセスの IAM ユーザーを設定することは、レジリエンス計画の一部となります。緊急時のユーザー認証情報は、多要素認証 (MFA) を使用して厳重に管理し、安全性を確保することをお勧めします。

## ロールに関する用語と概念
<a name="id_roles_terms-and-concepts"></a>

ロールの操作に役立つ基本的な用語を紹介します。

****ロール** **  
特定のアクセス権限を持ち、アカウントで作成できる IAM アイデンティティです。IAM ロールは、IAM ユーザーといくつかの類似点を持っています。ロールとユーザーは、両方とも、ID が AWS でできることとできないことを決定するアクセス許可ポリシーを持つ AWS ID です。ただし、ユーザーは 1 人の特定の人に一意に関連付けられますが、ロールはそれを必要とする任意の人が引き受けるようになっています。また、ロールには標準の長期認証情報 (パスワードやアクセスキーなど) も関連付けられません。代わりに、ロールを引き受けると、ロールセッション用の一時的なセキュリティ認証情報が提供されます。  
ロールを割り当てできるのは、以下のものです。  
+ 同じ AWS アカウント または別の AWS アカウント 内の IAM ユーザー
+ 同じアカウント内の IAM ロール
+ サービスプリンシパル。AWS のサービスおよび機能で使用します。
  + Amazon EC2 や AWS Lambda などのコンピューティングサービスでコードを実行できるようにするサービス
  + Amazon S3 オブジェクトのレプリケーションなど、ユーザーに代わってリソースに対してアクションを実行する機能
  + IAM Roles Anywhere や Amazon ECS Anywhere など、AWS の外部で実行されるアプリケーションに一時的なセキュリティ認証情報を提供するサービス
+ SAML 2.0 または OpenID Connect と互換性のある外部 ID プロバイダー (IdP) サービスによって認証される外部ユーザー

****AWS サービス ** ロール**  
 サービスロールとは、サービスがユーザーに代わってアクションを実行するために引き受ける [IAM ロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)です。IAM 管理者は、IAM 内からサービスロールを作成、変更、削除できます。詳細については、「*IAM ユーザーガイド*」の「[AWS のサービス に許可を委任するロールを作成する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)」を参照してください。

****AWS サービスにリンクされたロール****  
 サービスにリンクされたロールは、AWS のサービス にリンクされているサービスロールの一種です。サービスがロールを引き受け、ユーザーに代わってアクションを実行できるようになります。サービスにリンクされたロールは、AWS アカウント に表示され、サービスによって所有されます。IAM 管理者は、サービスリンクロールのアクセス許可を表示できますが、編集することはできません。  
サービスにリンクされたロールのサポートを開始する時点ですでにサービスを使用している場合は、アカウントの新しいロールに関する E メールが送信されることがあります。この場合、サービスにリンクされたロールは、サービスによって自動的にアカウントに作成されています。このロールをサポートするために必要な操作はありません。また、手動でロールを削除しないでください。詳細については、「[AWS アカウントに新しいロールが表示される](troubleshoot_roles.md#troubleshoot_roles_new-role-appeared)」を参照してください。
サービスにリンクされたロールを使用してサポートするサービスについては、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照し、**[Service-Linked Role]** (サービスにリンクされたロール) 列が **[Yes]** (はい) になっているサービスを検索してください。サービスリンクロールに関するドキュメントをサービスで表示するには、リンクで **[はい]** を選択します。詳細については、「[サービスにリンクされたロールの作成](id_roles_create-service-linked-role.md)」を参照してください。

****ロールの連鎖****  
ロールの連鎖は、 ロールを使用して 2 つ目のロールを引き受ける場合に発生します。ロール、AWS CLI、または API を切り替えることで、AWS マネジメントコンソール を介してロールの連鎖を実行できます。たとえば、`RoleA` には `RoleB` を引き受けるアクセス権があります。User1 は AssumeRole API オペレーションの長期的なユーザー認証情報を使用して `RoleA` を引き受けることができます。このオペレーションを用いて `RoleA` の短期的な認証情報を返します。ロールが連鎖していれば、User1 によって `RoleB` が引き受けられるよう `RoleA` の短期的な認証情報を使用できます。  
ロールを引き受けるときは、セッションタグを渡して、タグを推移的に設定できます。推移的なセッションタグは、ロールの連鎖内の後続のすべてのセッションに渡されます。セッションタグの詳細については、「[AWS STS でセッションタグを渡します](id_session-tags.md)」を参照してください。  
ロールの連鎖では、AWS マネジメントコンソール、AWS CLI、 または AWS API ロールセッションが最長 1 時間に制限されます。これは、個々のロールに対して設定されている最大セッション期間に関係なく適用されます。[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API オペレーションを使用してロールを引き受ける場合は、`DurationSeconds` パラメータを使用してロールセッションの期間を指定できます。パラメータの値は、[ロールの最大セッション期間設定](id_roles_update-role-settings.md#id_roles_update-session-duration)によって、最大 43200 秒 (12 時間) まで指定できます。ただし、ロールの連鎖を使用してロールを引き受ける場合、`DurationSeconds` パラメータ値で 1 時間を超える値を指定すると、オペレーションは失敗します。  
AWS マネジメントコンソール でのロールの切り替えの詳細については、「[ユーザーから IAM ロールに切り替える (コンソール)](id_roles_use_switch-role-console.md)」を参照してください。

****委任****  
委任により、制御するリソースへのアクセスを許可するユーザーにアクセス許可を付与できます。委任には、2 つのアカウント間の信頼を設定することが含まれます。1 つ目は、リソースを所有するアカウント（信頼するアカウント）です。2 つ目は、リソース（信頼されたアカウント）にアクセスする必要があるユーザーを含むアカウントです。信頼するアカウントと信頼されたアカウントには、以下のいずれかを指定できます。  
+ 同じアカウント。
+ 組織の制御下にある別々のアカウント。
+ 異なる組織によって所有される 2 つのアカウント。
リソースにアクセスする権限を委任するには、2 つのポリシーがアタッチされた信頼されるアカウントの [IAM ロールを作成します](id_roles_create_for-user.md)。*アクセス許可ポリシー*は、リソースに対して目的のタスクを実行するために必要なアクセス許可をロールのユーザーに付与します。*信頼ポリシー*は、信頼されたアカウントのどのメンバーにロールを割り当てることができるかを指定します。  
信頼ポリシーを作成する際、プリンシパル要素およびプリンシパル要素内の ARN の一部としてワイルドカード (\$1) を指定することはできません。信頼ポリシーは、信頼するアカウントのロールにアタッチされ、アクセス許可の半分です。残りの半分は、[ユーザーがロールを切り替えることができる、またはロールを引き受けることができる](id_roles_use_permissions-to-switch.md)信頼されたアカウントのユーザーにアタッチされたアクセス許可ポリシーです。ロールを引き受けるユーザーの各自のアクセス権限は一時的に無効になりますが、その代わりにロールのアクセス権限を取得します。ユーザーがロールの使用を終了または停止すると、元のユーザーアクセス権限に戻ります。[外部 ID](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id) という追加パラメータは、同じ組織がコントロールしていないアカウント間でロールを安全に利用するのに役立ちます。

****信頼ポリシー****  
[JSON ポリシードキュメント](reference_policies_grammar.md)では、ロールを引き受けるために*信頼する*プリンシパルを定義します。ロール信頼ポリシーは、IAMのロールに関連付けられている必須の[リソースベースのポリシー](access_policies.md#policies_resource-based)です。信頼ポリシーで指定できる[プリンシパル](reference_policies_elements_principal.md)には、ユーザー、ロール、アカウント、およびサービスが含まれます。詳細については、「*AWS セキュリティブログ*」の「[IAM ロールで信頼ポリシーを使用する方法](https://aws.amazon.com/blogs//security/how-to-use-trust-policies-with-iam-roles/)」を参照してください。

****クロスアカウントアクセスのロール****  
あるアカウントのリソースに対するアクセス権限を、別のアカウントの信頼されるプリンシパルに付与するロール。クロスアカウントアクセスを許可する主な方法は、ロールを使用することです。ただし、一部の AWS サービスでは、リソースにポリシーを直接アタッチすることができます (ロールをプロキシとして使用する代わりに)。これらはリソースベースのポリシーと呼ばれ、別の AWS アカウント のプリンシパルにリソースへのアクセスを許可するために使用できます。これらのリソースには、Amazon Simple Storage Service (S3) バケット、Amazon Glacier ボールト、Amazon Simple Notification Service (SNS) トピック、Amazon Simple Queue Service (SQS) キューなどがあります。リソースベースのポリシーをサポートするサービスを確認するには､「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照してください｡ リソースベースのポリシーの詳細については、「[IAM でのクロスアカウントのリソースへのアクセス](access_policies-cross-account-resource-access.md)」を参照してください。

## その他のリソース
<a name="id_roles_additional-resources"></a>

以下のリソースは、IAM ロールに関連する IAM 用語の詳細を理解するのに役立ちます。
+ **プリンシパル**は、アクションを実行してリソースにアクセスできる AWS のエンティティです。プリンシパルは、AWS アカウントのルートユーザー、IAM ユーザー、またはロールをにすることができます。AWS サービスのアイデンティティを表すプリンシパルは、[サービスプリンシパル](reference_policies_elements_principal.md#principal-services)です。ロール信頼ポリシーのプリンシパル要素を使用して、ロールを引き受けると信頼するプリンシパルを定義します。

   ロールの引き受けを許可できるプリンシパルの詳細と例については、「[AWS JSON ポリシーの要素: Principal](reference_policies_elements_principal.md)」を参照してください。
+ **ID フェデレーション**は、外部 ID プロバイダーと AWS の間に信頼関係を作成します。既存の OpenID Connect (OIDC) または Security Assertion Markup Language (SAML) 2.0 プロバイダーを使用して、 AWS リソースにアクセスできるユーザーを管理できます。OIDC および SAML 2.0 を使用して、これらの外部 ID プロバイダーと AWS との信頼関係を設定する場合、ユーザーは IAM ロールに割り当てられます。ユーザーは一時的な認証情報を受け取り、これを使用して AWS リソースにアクセスすることもできます。

  フェデレーティッドプリンシパルの詳細については、「[ID プロバイダーと AWS とのフェデレーション](id_roles_providers.md)」を参照してください。
+ **フェデレーティッドプリンシパル**は、企業のユーザーディレクトリ、Directory Service からのOIDC プロバイダーの既存 ID です。[ID プロバイダー](id_roles_providers.md)を通じてアクセスがリクエストされると、AWS はフェデレーティッドプリンシパルにロールを割り当てます。

  SAML および OIDC のフェデレーティッドプリンシパルの詳細については、「[フェデレーションユーザーのセッションとロール](introduction_access-management.md#intro-access-roles)」を参照してください。
+ **アクセス許可ポリシー**は、ロールが使用できるアクションとリソースを定義するアイデンティティベースのポリシーです。ドキュメントは IAM ポリシー言語のルールに従って記述されます。

  詳細については、「[IAM JSON ポリシーリファレンス](reference_policies.md)」を参照してください。
+ **アクセス許可の境界**は、ポリシーを使用して、アイデンティティベースのポリシーがロールに付与できるアクセス許可の上限を設定する高度な機能です。アクセス許可の境界をサービスにリンクされたロールに適用することはできません。

  詳細については、「[IAM エンティティのアクセス許可境界](access_policies_boundaries.md)」を参照してください。

# 混乱する代理問題
<a name="confused-deputy"></a>

混乱した代理問題は、アクションを実行する許可を持たないエンティティが、より特権のあるエンティティにアクションを実行するように強制できるセキュリティの問題です。これを防ぐために、サードパーティー (*クロスアカウント*) や 他の AWS サービス (*クロスサービス*)に対して、お客様のアカウント内のリソースへのアクセス権を提供してしまった場合に、お客様のアカウントの保護に役立つツールを AWS が提供します。

お客様の AWS リソースへのアクセス権をサードパーティーに付与 (委任) することが必要になる場合があります。例えば、Example Corp という第三者企業を雇って、コストを最適化するためにお客様の AWS アカウント をモニタリングする業務を依頼することにします。Example Corp がお客様の毎日の支出を追跡するには、お客様の AWS リソースにアクセスする必要があります。また、Example Corp は他の顧客について他の多くの AWS アカウント をモニタリングしています。IAM ロールを使用して AWS アカウント と Example Corp アカウントと間の信頼関係を確立できます。このシナリオで重要なのは、オプションの識別子としての*外部 ID* です。この ID を IAM ロールの信頼ポリシーで使用することで、ロールを引き受けることができるユーザーを指定できます。外部 ID の最も重要な機能は、混乱した代理問題の防止と対処です。

一部の AWS サービス (呼び出し元サービス) は、AWS サービスプリンシパルを使用して、他の AWS サービス (呼び出し先サービス) から AWS リソースにアクセスします。これらのサービスインタラクションの一部では、別の AWS アカウント で呼び出し先サービスからリソースと通信するように呼び出し元サービスを設定できます。これの例としては、別の AWS アカウント にある中央 Amazon S3 バケットに書き込むように AWS CloudTrail を設定することが挙げられます。呼び出し元のサービスである CloudTrail には、`cloudtrail.amazonaws.com` の allow ステートメントを追加することで、S3 バケットのポリシーを使用する S3 バケットへのアクセスが付与されます。

呼び出し元のサービスの AWS サービスプリンシパルが呼び出し先のサービスからリソースにアクセスしている場合、呼び出し先のサービスのリソースポリシーは、呼び出し元のサービスを設定したアクターではなく、AWS サービスプリンシパルのみを承認します。例えば、条件なしで CloudTrail サービスプリンシパルを信頼する S3 バケットは、信頼された管理者が設定した AWS アカウント から CloudTrail ログを受信できますが、Amazon S3 バケットの名前がわかっている場合は、AWS アカウント 内の不正なアクターから CloudTrail ログを受信することもできます。

混乱した代理問題は、アクターが AWS サービスのサービスプリンシパルの信頼を使用して、アクセスすることを意図していないリソースにアクセスする場合に発生します。

## クロスアカウントでの混乱した代理
<a name="mitigate-confused-deputy"></a>

次の図は、クロスアカウントでの「混乱した代理」問題を示しています。

![\[「混乱した代理」問題の説明\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/confuseddeputyproblem2.png)


このシナリオでは、次のことを前提としています。
+ **AWS1** はあなたの AWS アカウント。
+ **AWS1:ExampleRole** は、お客様のアカウントのロールである。このロールの信頼ポリシーは、Example Corp の AWS アカウントを、ロールを引き受けることができるアカウントとして指定することによって、Example Corp を信頼しています。

次の状況が発生します。

1. お客様は、Example Corp のサービスの使用を開始するとき、**AWS1:ExampleRole** の ARN を Example Corp に提供します。

1. Example Corp はそのロールの ARN を使用して、お客様の AWS アカウント のリソースにアクセスするために必要な一時的なセキュリティ認証情報を入手します。この方法では、お客様に代わって操作を実行できる "代理" として Example Corp を信頼します。

1. 別の AWS ユーザーも Example Corp のサービスを利用し始め、このユーザーも **AWS1:ExampleRole** の ARN を Example Corp が使用できるように提供するとします。この別のユーザーは、秘密ではない **AWS1:ExampleRole** を知った、または推測した可能性があります。

1. その別のユーザーが Example Corp に自分のアカウントの AWS リソース (そう自称しているリソース) へのアクセスを依頼すると、Example Corp は **AWS1:ExampleRole** を使用してお客様のアカウントのリソースにアクセスします。

このようにして、その別のユーザーはお客様のリソースに不正にアクセスできます。Example Corp は、この別のユーザーによって操られ、無意識にお客様のリソースにアクセスしたため、"混乱した代理" になります。

Example Corp は、ロールの信頼ポリシーに `ExternalId` の条件の確認を含めることを必須とすることで、「混乱した代理」問題に対応できます。Example Corp は、顧客ごとに一意の `ExternalId` 値を生成して、ロールを引き受けるリクエストでその値を使用します。`ExternalId` 値は、Example Corp の顧客の間で一意でなければならず、Example Corp の顧客ではなく、Example Corp によって管理されます。そのため、外部 ID は Example Corp から取得するものであり、自分では用意できません。これにより、Example Corp が混乱した代理人になることを防ぎ、別のアカウントの AWS リソースへのアクセスを許可してしまうことを防ぎます。

このシナリオでは、Example Corp がお客様に割り当てた一意の ID は 12345 であり、もう一方のお客様に割り当てた ID は 67890 であるとします。これらの ID は、このシナリオで使用することのみを目的としているため、簡略化されています。通常、これらの ID は GUID です。これらの ID が Example Corp の顧客の間で一意であることを考慮すると、これらの値を外部 ID として使用することは賢明です。

Example Corp はお客様に 12345 という外部 ID 値を提供します。お客様は、`Condition` 値が 12345 であることを必須とする以下のような [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) 要素をロールの信頼ポリシーに追加する必要があります。

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

****  

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

------

このポリシーの Condition 要素により、AssumeRole API 呼び出しに 12345 という外部 ID 値が含まれている場合にのみ Example Corp はロールを引き受けることができます。Example Corp は、顧客に代わってロールを引き受けるたびに、その顧客の外部 ID 値を AssumeRole 呼び出しに含めます。別の顧客がお客様の ARN を Example Corp に提供した場合でも、Example Corp が AWS へのリクエストに含める外部 ID を顧客がコントロールすることはできません。これにより、権限のない顧客がお客様のリソースにアクセスすることを防止できます。

次の図は、このプロセスを示したものです。

![\[「混乱した代理」問題を解消する方法\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/confuseddeputymitigation2.png)


1. 前述と同様に、お客様は、Example Corp のサービスを利用し始めるとき、**AWS1:ExampleRole** の ARN を Example Corp に提供します。

1.  Example Corp がそのロールの ARN を使用して **AWS1:ExampleRole** ロールを引き受けるとき、Example Corp は AssumeRole API コールにお客様の外部 ID (12345) を含めます。この外部 ID はロールの信頼ポリシーと一致するため、AssumeRole API 呼び出しは正常に実行され、Example Corp はお客様の AWS アカウント のリソースにアクセスするための一時的なセキュリティ認証情報を取得します。

1. 別の AWS ユーザーも Example Corp のサービスを利用し始め、先ほどと同様、このユーザーも **AWS1:ExampleRole** の ARN を Example Corp が使用できるように提供するとします。

1. しかし、今回は、Example Corp が **AWS1:ExampleRole** ロールを引き受けるとき、もう一方のお客様に関連付けられている外部 ID (67890) が提供されます。その別の顧客がこの ID を変更することはできません。Example Corp がこれを行うのは、ロールを使用するリクエストがもう一方のお客様から来たからであり、67890 は Example Corp が業務を遂行する環境を示すからです。お客様は自身の外部 ID (12345) を使用する条件を **AWS1:ExampleRole** の信頼ポリシーに追加したため、AssumeRole API コールは失敗します。別の顧客がお客様のアカウントのリソースに不正にアクセスすることが防止されます (図の赤色の「X」で示しています)。

外部 ID により、Example Corp が他の顧客によって操られ、無意識にお客様のリソースにアクセスすることを防止します。

## サービス間の混乱した代理の防止
<a name="cross-service-confused-deputy-prevention"></a>

次の図は、CloudTrail と Amazon S3 のインタラクションの例を使用して、サービス間の混乱した代理問題を示しています。ここでは、権限のないアクターが、アクセス権が付与されていない Amazon S3 バケットに CloudTrail ログを書き込みます。

![\[権限のないアクターには、CloudTrail サービスプリンシパルを使用して、別のアカウントの Amazon S3 バケットへのアクセス権が付与されます。\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/cross-service-confused-deputy1.png)


権限のないアクターが AWS プリンシパルの信頼を使用してリソースにアクセスできないように保護するために、AWS サービスプリンシパルには、代理で動作する AWS リソース、AWS アカウント、AWS 組織に関する情報があります。

この情報は、リソースポリシーで使用できるグローバル条件キー値、または AWS サービスプリンシパルによって行われたリクエストのリソースコントロールポリシーで使用できます。AWS サービスプリンシパルにリソースの 1 つにアクセスするためのアクセス許可が付与されている場合は、リソースポリシーで [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)、または [aws:SourceOrgPaths](reference_policies_condition-keys.md#condition-keys-sourceorgpaths) を使用することをお勧めします。これらの条件キーを使用すると、リソースポリシー、または リソースにアクセスする AWS サービスプリンシパルが、AWS リソース、AWS アカウント、または想定する AWS Organizations の代理で実行しているリソースコントロールポリシーでテストできます。
+ `aws:SourceArn` を使用して、AWS サービスプリンシパルが、特定の AWS CloudTrail 証跡や AppStream フリートなどの特定のリソースの代理としてリソースにアクセスできるようにします。
+ `aws:SourceAccount` を使用して、AWS サービスプリンシパルが特定の AWS アカウント の代理としてリソースにアクセスできるようにします。
+ `aws:SourceOrgID` を使用して、AWS サービスプリンシパルが特定の AWS Organizations の代理としてリソースにアクセスできるようにします。
+ `aws:SourceOrgPaths` を使用して、AWS サービスプリンシパルが特定の AWS Organizations パスの代理としてリソースにアクセスできるようにします。

次の図は、リソースが `aws:SourceAccount` グローバル条件コンテキストキーで設定されていて、別のアカウントの不正なアクターがアクセスすることを意図していない AWS リソースにアクセスしようとする、サービス間の混乱した代理シナリオを示しています。

![\[不正なアクターは、CloudTrail サービスプリンシパルを使用して、別のアカウントの Amazon S3 バケットへのアクセスを拒否されます。\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/cross-service-confused-deputy2.png)


ポリシーで `aws:SourceArn`、`aws:SourceAccount`、`aws:SourceOrgID`、および `aws:SourceOrgPaths` グローバル条件キーを使用すると、サービスプリンシパルがユーザーの代理としてリソースにアクセスしていることを確認できます。これらの条件キーは、いずれかのリソースへのアクセスが AWS サービスプリンシパルに付与されるたびに使用することをお勧めします。

**注記**  
一部の AWS のサービス インタラクションには、ユーザーによるリソースへのアクセスをテストするサービス間の混乱した代理問題から保護するのに役立つ追加のコントロールがあります。例えば、KMS キー付与が AWS のサービス に発行されると、AWS KMS はリソースに関連付けられた暗号化コンテキストとキーのグラントを使用して、サービス間の混乱した代理問題から保護します。  
サービス間の混乱した代理リスクを回避するのに役立つサービス固有のメカニズム、および `aws:SourceArn`、`aws:SourceAccount`、`aws:SourceOrgID`、`aws:SourceOrgPaths` がサポートされるかどうかの詳細については、使用するサービスのドキュメントを参照してください。

## リソースベースのポリシーによるサービス間の混乱した代理保護
<a name="cross-service-confused-deputy-prevention-resource"></a>

次のポリシー例では、サービスプリンシパル AWS アカウント が 111122223333 に代わって動作している場合にのみ、サービスプリンシパル `cloudtrail.amazonaws.com` に Amazon S3 バケット arn:aws:s3:::amzn-s3-demo-bucket1 へのアクセスを許可します。

------
#### [ 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"
                }
            }
        }
    ]
}
```

------

このバケットポリシーの例では、`aws:SourceArn` でフリート ARN を指定することで、指定された Amazon AppStream フリートに代わって動作している場合にのみ、s3://amzn-s3-demo-bucket2 内の powershell スクリプト examplefile.psh へのアクセスをサービスプリンシパル `appstream.amazonaws.com` に許可します。

------
#### [ 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"
                } 
            }
        }
    ]
}
```

------

## リソースコントロールポリシーによるサービス間の混乱した代理保護
<a name="cross-service-confused-deputy-prevention-resource-control"></a>

リソースコントロールポリシー (RCP) を使用して、サポートされている AWS のサービス のリソースにサービス間の混乱した代理コントロールを適用できます。RCP を使用すると、サービス間の混乱した代理コントロールをリソースに一元的に適用できます。特定のリソースベースポリシーにステートメントを追加しなくても、組織内の AWS Organizations、組織単位 (OU)、または AWS アカウント にアタッチされた RCP で、`aws:SourceOrgId` や `aws:SourceOrgPaths` のような条件キーを使用できます。RPC とサポートされているサービスに関する詳細については、「*AWS Organizations ユーザーガイド*」の「[リソースコントロールポリシー (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)」を参照してください。

次の RCP の例では、`aws:SourceOrgID` が o-ExampleOrg に相当する場合、メンバーアカウントの Amazon S3 バケットへの AWS サービスプリンシパルアクセスを拒否します。`SourceOrgID` が o-ExampleOrg に等しい AWS のサービス プリンシパルを許可するには、対応する許可が S3 バケットのリソースベースのポリシーに存在する必要があります

このポリシーは、`aws:SourceAccount` キーが存在するサービスプリンシパル (`"Bool": {"aws:PrincipalIsAWSService": "true"}`) によるリクエストに対してのみ、コントロールを適用します (`"Null": {"aws:SourceAccount": "false"}`)。これにより、この条件キーの使用を必要としないサービス統合とプリンシパルによる呼び出しは影響を受けません。`aws:SourceAccount` 条件キーがリクエストコンテキストに存在する場合、Null 条件は true に評価され、`aws:SourceOrgID` が強制適用されます。リクエストが組織に属さないアカウントからのものである場合でもコントロールが適用されるように、Null 条件演算子では `aws:SourceOrgID` ではなく `aws:SourceAccount` が使用されます。

------
#### [ 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"
        }
      }
    }
  ]
}
```

------

# IAM ロールによく見られるシナリオ
<a name="id_roles_common-scenarios"></a>

多くの AWS 機能と同様に、通常ロールを使用する方法には、IAM コンソールでインタラクティブに使用する方法と、AWS CLI、Tools for Windows PowerShell、API のいずれかを使用してプログラムで使用する方法の 2 つがあります。
+ IAM コンソールを使用するアカウントの IAM ユーザーは、別のロールに*切り替えて*、コンソールでそのロールのアクセス許可を一時的に使用できます。ユーザーは、元のアクセス権限を返却し、そのロールに割り当てられたアクセス権限を取得します。ユーザーがそのロールを終了すると、元のアクセス権限に戻ります。
+ アプリケーションまたは AWS によって提供されるサービス (Amazon EC2 など) は、AWS にプログラムによるリクエストを行うためのロールの一時的セキュリティ認証情報をリクエストすることで、ロールを*引き受ける*ことができます。ロールをこのように使用することで、リソースへのアクセスが必要なエンティティごとに長期的なセキュリティ認証情報を共有または保持する (IAM ユーザーを作成するなどして) 必要がなくなります。

**注記**  
このガイドでは、*ロールの切り替え*および*ロールの引き受け*という言葉を、ほとんど同じ意味で使用しています。

ロールを使用する最もシンプルな方法は、自分のアカウントまたは別の AWS アカウント 内に作成したロールに切り替えるアクセス許可を IAM ユーザーに付与する方法です。IAM ユーザーは、 コンソールを使用して簡単にロールを切り替え、通常は必要ないアクセス許可を使用することができます。その後、ロールを終了して、それらのアクセス許可を返却できます。これは、機密性の高いリソースに*誤って*アクセスしたり変更したりすることを回避するのに役立ちます。

アプリケーションとサービスへのアクセスを許可する (つまり、外部フェデレーションユーザー) など、ロールを複雑な方法で使用するには、`AssumeRole` API を呼び出します。この API 呼び出しは、アプリケーションが後続の API 呼び出しで使用できる一時的な認証情報のセットを返します。一時的な認証情報を使用して試行されたアクションは、関連付けられたロールによって付与されたアクセス権限のみを使用します。アプリケーションは、ユーザーがコンソールで行った方法でロールを "終了" する必要はありません。アプリケーションは一時的な認証情報を使用して停止し、元の認証情報で呼び出しを再開するだけです。

フェデレーティッドユーザーは、ID プロバイダー (IdP) から提供される認証情報を使用してサインインします。その後、AWS は一時的な認証情報を信頼された IdP に提供し、後続の AWS リソースリクエストに含めることができるようにユーザーに渡します。これらの認証情報は、割り当てられたロールに付与されたアクセス権限を提供します。

このセクションは、次のシナリオの概要を提供します。
+ [ユーザーが所有する別のアカウントのリソースにアクセスできるように、ユーザーが所有する 1 つの AWS アカウント の IAM ユーザーにアクセスを許可する](id_roles_common-scenarios_aws-accounts.md)
+ [AWS ワークロード以外へのアクセスを提供する](id_roles_common-scenarios_non-aws.md)
+ [サードパーティーが所有する AWS アカウント の IAM ユーザーへのアクセスを許可する](id_roles_common-scenarios_third-party.md)
+ [AWS が提供するサービスに AWS リソースへのアクセスを許可する](id_roles_common-scenarios_services.md)
+ [外部で認証された (ID フェデレーション) ユーザーにアクセスを許可する](id_roles_common-scenarios_federated-users.md)

# 所有している別の AWS アカウント内の IAM ユーザーに対するアクセス
<a name="id_roles_common-scenarios_aws-accounts"></a>

IAM ユーザーには、AWS アカウント 内のロール、または所有する他の AWS アカウント で定義されたロールに切り替えるアクセス許可を付与することができます。

**注記**  
お客様が所有または制御していないアカウントへのアクセス権を付与する場合は、このトピックの「[第三者が所有する AWS アカウント へのアクセス](id_roles_common-scenarios_third-party.md)」を参照してください。

組織の業務に不可欠な Amazon EC2 インスタンスがあるとします。このインスタンスを終了するためのアクセス許可をユーザーに直接付与する代わりに、これらの権限を持つロールを作成できます。次に、インスタンスを終了する必要があるときに、このロールに切り替えることを管理者に許可します。これにより、インスタンスに次の保護レイヤーが追加されます。
+ ユーザーにロールを引き受けるアクセス権限を明示的に付与する必要があります。
+ ユーザーは、アクティブに AWS マネジメントコンソール を使用してロールに切り替えるか、AWS CLI または AWS API を使用してロールを引き受ける必要があります。
+ MFA デバイスでサインインしているユーザーのみがロールを引き受けることができるように、ロールに多要素認証 (MFA) 保護を追加できます。ロールを引き受けるユーザーが最初に多要素認証 (MFA) を使用して認証されるようにロールを設定する方法については、「[MFA を使用した安全な API アクセス](id_credentials_mfa_configure-api-require.md)」を参照してください。

このアプローチを使用して*最小権限の原則*を強制することをお勧めします。つまり、昇格されたアクセス許可の使用は、特定のタスクに必要なときのみに制限されます。ロールを使用すると、機密性の高い環境が誤って変更されるのを防ぐことができます (特に、ロールが必要なときだけ使用されるように[監査](cloudtrail-integration.md)と組み合わせている場合)。

この目的でロールを作成する場合、ユーザーがロールの信頼ポリシーの `Principal` 要素にアクセスする必要のあるアカウントを ID で指定します。その後、その他のアカウントの特定のユーザーに、そのロールに切り替えるためのアクセス権限を付与できます。信頼ゾーン (信頼できる組織またはアカウント) 外にあるアカウントのプリンシパルにロールを引き受けるアクセス権があるかどうかについては、「[IAM Access Analyzer とは](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)」を参照してください。

あるアカウントのユーザーは、同じアカウントまたは別のアカウントのロールに切り替えることができます。そのロールを使用している間、ユーザーはアクションだけを実行して、ロールによって許可されているリソースのみにアクセスできますが、元のユーザーアクセス権限は停止されます。ユーザーがそのロールを終了すると、元のユーザーのアクセス権限に戻ります。

## 個別の開発用アカウントと本稼働用アカウントを使用したシナリオ例
<a name="id_roles_common-scenarios_aws-accounts-example"></a>

本稼働環境から開発環境を分離するための複数の AWS アカウント が組織に存在するとします。開発アカウントのユーザーは、本番稼働用アカウントでリソースにアクセスすることが必要になる場合があります。たとえば、開発環境から本番稼働環境に更新を昇格させる場合、クロスアカウントアクセスが必要になることがあります。両方のアカウントで作業するユーザーにそれぞれの ID（およびパスワード）を作成することも可能ですが、複数のアカウントに対する複数の認証情報を管理する必要があり、ID 管理が困難になります。以下の図では、すべてのユーザーは開発用アカウントで管理されていますが、数名の開発者は本稼働用アカウントに制限付きでアクセスする必要があります。開発用アカウントにはテスターと開発者の 2 つのグループがあり、それぞれ個別のポリシーがあります。

![\[ロールを使用して別のアカウントのユーザーにアクセス権限を委任する\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/roles-usingroletodelegate.png)


1. 管理者は、本番稼働用アカウントで IAM を使用し、このアカウントで `UpdateApp` ロールを作成します。ロールでは、管理者は開発用アカウントを `Principal` として指定する信頼ポリシーを定義します。これは、開発用アカウントの認証されたユーザーが `UpdateApp` ロールを使用できることを意味します。また、管理者は、`productionapp` という Amazon S3 バケットに対する読み取りと書き込みを指定するロールについてのアクセス許可ポリシーを定義します。

   次に、管理者は、このロールを引き受ける必要がある任意のユーザーと該当情報を共有します。この情報は、ロールのアカウント番号と名前 (AWS コンソールユーザーの場合)、または Amazon リソースネーム (ARN) (AWS CLI または AWS API アクセスの場合) です。ロールの ARN は `arn:aws:iam::123456789012:role/UpdateApp` のようになります。これは、ロールの名前が `UpdateApp` で、ロールがアカウント番号 123456789012 に作成されたことを意味します。
**注記**  
管理者は、ロールを引き受けるユーザーが最初に多要素認証 (MFA) を使用して認証されるように、オプションでロールを設定できます。詳細については、「[MFA を使用した安全な API アクセス](id_credentials_mfa_configure-api-require.md)」を参照してください。

1. 開発アカウントでは、管理者は開発者グループのメンバーに対して、このロールに切り替えるアクセス許可を付与します。これは、Developers グループに AWS Security Token Service（AWS STS）`UpdateApp` ロールの `AssumeRole` API を呼び出すアクセス権限を付与することで行われます。これにより、開発用アカウントの Developers グループに所属する IAM ユーザーは、本稼働用アカウントの `UpdateApp` ロールに切り替えることができます。Developers グループに所属しないの他のユーザーには、そのロールに切り替えるアクセス許可がないため、本番稼働用アカウントの S3 バケットにはアクセスできません。

1. ユーザーは、ロールへの切り替えをリクエストします。
   + AWS コンソール: ユーザーはナビゲーションバーのアカウント名を選択してから、[**ロールの切り替え**] を選択します。ユーザーは、アカウント ID（またはエイリアス）とロール名を指定します。または、管理者からメールで送信されたリンクをクリックすることもできます。リンクをクリックすると、詳細がすでに入力された [**ロールの切り替え**] ページに移動します。
   + AWS API/AWS CLI: 開発用アカウントの Developers グループに所属するユーザーが `AssumeRole` 関数を呼び出し、`UpdateApp` ロールの認証情報を取得します。呼び出しの一部として、ユーザーが `UpdateApp` ロールの ARN を指定します。Testers グループのユーザーが同じ要求をしても、テスターは `UpdateApp` ロールの ARN に対して `AssumeRole` を呼び出すことは許可されていないため、その要求は拒否されます。

1. AWS STS が一時的な認証情報を返します。
   + AWS コンソール: AWS STS はリクエストをロールの信頼ポリシーと照合し、そのリクエストが信頼されたエンティティ (開発用アカウント) からであることを確認します。照合の後、AWS STS は AWS コンソールに[一時的セキュリティ認証情報](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html)を返します。
   + API/CLI: AWS STS は、リクエストをロールの信頼ポリシーと照合し、信頼されたエンティティ (Development アカウント) からであることを確認します。照合の後、AWS STS はアプリケーションに[一時的セキュリティ認証情報](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html)を返します。

1. 一時的な認証情報により、AWS リソースにアクセスすることができます。
   + AWS コンソール: AWS コンソールは、後続のすべてのコンソールアクション (この場合は、`productionapp` バケットの読み書き) でユーザーの代わりに一時的な認証情報を使用します。コンソールは、本稼働用アカウントにある他のリソースにはアクセスできません。ユーザーがロールを終了すると、ユーザーのアクセス権限がロールに切り替える前に持っていた元のアクセス権限に戻ります。
   + API/CLI: アプリケーションは、その一時的な認証情報を使用して `productionapp` バケットを更新します。一時的な認証情報を使用し、アプリケーションは `productionapp` バケットでのみ読み書きを行うことができますが、本番稼働用アカウントにあるその他のリソースにはアクセスできません。アプリケーションは、ロールを終了する必要はありませんが、その代わりに一時的な認証情報の使用を停止し、後続の API 呼び出しで元の認証情報の使用する必要があります。

## その他のリソース
<a name="id_roles_common-scenarios_more-info"></a>

詳細については次を参照してください:
+ [IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任](tutorial_cross-account-with-roles.md)

# AWS 以外のワークロードに対するアクセス
<a name="id_roles_common-scenarios_non-aws"></a>

[IAM ロール](id_roles.md)は、[アクセス許可](access_policies.md)が割り当てられている AWS Identity and Access Management IAM 内のオブジェクトです。IAMの ID または AWS 外部からの ID を使用して[そのロールを引き受ける](id_roles_manage-assume.md)と、ロールセッションのための一時的なセキュリティ認証情報が提供されます。データセンターや AWS 以外のインフラストラクチャで実行されるワークロードが、AWS リソースにアクセスしなければならない場合があります。長期的なアクセスキーを作成、配布、管理する代わりに、AWS Identity and Access Management Roles Anywhere (IAM Roles Anywhere) を使用して AWS 以外のワークロードを認証することができます。IAM Roles Anywhere は、認証局 (CA) から発行された X.509 証明書を使用して ID を認証し、IAM ロールによって提供される一時的な認証情報を使用した AWS のサービス への安全なアクセスを提供します。

**IAM Roles Anywhere を使用するには**

1. [AWS Private Certificate Authority](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html) を使用して CA を設定するか、独自の PKI インフラストラクチャの CA を使用します。

1. CA を設定したら、IAM Roles Anywhere にトラストアンカーと呼ばれるオブジェクトを作成します。このアンカーは、IAM Roles Anywhere と CA との間に認証目的で信頼を確立します。

1. その後、既存の IAM ロールを設定するか、IAM Roles Anywhere サービスを信頼する新しいロールを作成できます。

1. トラストアンカーを使用して IAM Roles Anywhere で AWS 以外のワークロードを認証します。AWS は AWS リソースへのアクセスが許可された IAM ロールに対し、AWS 以外のワークロードの一時的な認証情報を付与します。

## 追加リソース
<a name="id_roles_non-aws_additional_resources"></a>

AWS 以外のワークロードへのアクセスを提供する方法について詳しく知りたい場合は、以下のリソースを参考にすると便利です。
+ IAM Roles Anywhere の設定の詳細については、「*IAM Roles Anywhere User Guide*」(IAM Roles Anywhere ユーザーガイド) の「[What is AWS Identity and Access Management Roles Anywhere](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html)」( Roles Anywhere とは) を参照してください。
+ IAM Roles Anywhere のパブリックキーインフラストラクチャ (PKI) を設定する方法については、「AWS セキュリティブログ」の「[IAM Roles Anywhere with an external certificate authority](https://aws.amazon.com/blogs/)」を参照してください。

# 第三者が所有する AWS アカウント へのアクセス
<a name="id_roles_common-scenarios_third-party"></a>

組織内の AWS リソースへ組織外の第三者がアクセスする必要がある場合には、ロールを使用することでアクセス許可を委任することができます。たとえば、組織内の AWS リソースの管理を第三者へ委託しているような場合が相当します。IAM ロールを使用することで、AWS セキュリティ認証情報を共有することなく第三者に AWS リソースへのアクセスを許可することができます。第三者は代わりに、AWS アカウント に作成したロールを引き受けることで、AWS リソースにアクセスできます。信頼ゾーン (信頼できる組織またはアカウント) 外にあるアカウントのプリンシパルにロールを引き受けるアクセス権があるかどうかについては、「[IAM Access Analyzer とは](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)」を参照してください。

第三者は、以下の情報を提供する必要があります。これらの情報は、第三者が引き受けることのできるロールの作成に必要です。
+ **第三者の AWS アカウント ID**。ロールの信頼ポリシーを定義するときは、その AWS アカウント ID をプリンシパルとして指定します。
+ **ロールを一意に関連付けるための外部 ID**。外部 ID は、ユーザーと第三者によってのみ識別される識別子です。たとえば、ユーザーとサードパーティーの間の請求書 ID は使用できますが、サードパーティーの名前や電話番号などの推測できるものは使用しないでください。ロールの信頼ポリシーを定義するときは、この ID を指定する必要があります。サードパーティーは、ロールを引き受けるときに、この ID を指定する必要があります。
+ **第三者が AWS リソースでの作業を行うのに必要なアクセス許可**。ロールのアクセス許可ポリシーを定義する際に、権限を指定する必要があります。このポリシーには、第三者はどのアクションができるのか、およびどのリソースにアクセスできるのかが定義されています。

ロールの作成が完了したら、そのロールの Amazon リソースネーム（ARN）を対象の第三者に提供します。第三者がロールを担当するにあたり、このロールの ARN を必要とします。

**重要**  
お客様の AWS リソースへのアクセスを第三者に許可すると、第三者はポリシーで指定したすべてのリソースにアクセスできます。サードパーティーによるリソースの使用は、ユーザーに請求されます。したがって、第三者によるリソースの使用については適切な制限を設けるようにしてください。

## 第三者によるアクセスのための外部 ID
<a name="id_roles_third-party_external-id"></a>

外部 ID を使用すると、ロールを引き受けるユーザーは、業務を遂行する環境へのアクセスをリクエストできます。また、アカウント所有者が、特定の環境においてのみロールを引き受けることができるようにする方法の 1 つでもあります。外部 ID の最も重要な機能は、[混乱する代理問題](confused-deputy.md) の防止と対処です。

**重要**  
AWS は、外部 ID を機密情報として扱いません。アクセスキーペアやパスワードなどの機密情報を AWS で作成した場合、それらを再び表示することはできません。ロールの外部 ID は、ロールを表示する権限を持つすべてのユーザーが表示できます。

## 外部 ID が適している状況
<a name="external-id-use"></a>

外部 ID は以下の状況で使用します。
+ お客様は AWS アカウント の所有者で、それ以外の AWS アカウント アカウントにアクセスするロールを第三者のために設定しました。第三者がお客様のロールを引き受けるときに含める外部 ID は、第三者に問い合わせる必要があります。その後、ロールの信頼ポリシーでその外部 ID を確認します。これにより、外部の第三者は、お客様に代わって操作を行う場合にのみ、お客様のロールを引き受けることができます。
+ お客様は、前のシナリオの Example Corp のように、さまざまな顧客に代わってロールを引き受ける立場にあります。各顧客に一意の外部 ID を割り当て、ロールの信頼ポリシーに外部 ID を追加するように指示します。ロールを引き受けるには、リクエストに正しい外部 ID が常に含まれていることを確認する必要があります。

  既にそれぞれの顧客に一意の ID を割り当てている場合は、この一意の ID を外部 ID として使用できます。外部 ID は、この目的のためだけに明示的に作成したり個別に追跡したりする必要のある特別な値ではありません。

  外部 ID は常に `AssumeRole` API 呼び出しで指定する必要があります。さらに、顧客からロールの ARN を受け取ったら、正しい外部 ID と正しくない外部 ID の両方を使用して、そのロールを引き受けることができるかどうかをテストします。正しい外部 ID がなくてもロールを引き受けることのできる場合は、システムに顧客のロール ARN を保存しないでください。顧客がロール信頼ポリシーを更新し、正しい外部 ID を要求するまで待ちます。こうすることにより、顧客による不正を防止し、"混乱した代理" 問題からお客様と顧客の両方を守ることができます。

## 外部 ID を使用したシナリオの例
<a name="id_roles_third-party_example"></a>

例えば、Example Corp という第三者企業を雇って、コストを最適化するためにお客様の AWS アカウント をモニタリングする業務を依頼するとします。Example Corp がお客様の毎日の支出を追跡するには、お客様の AWS リソースにアクセスする必要があります。また、Example Corp は他の顧客について他の多くの AWS アカウントをモニタリングしています。

Example Corp に AWS アカウントの IAM ユーザーとのその長期的認証情報へのアクセスを許可しないでください。代わりに、IAM ロールとその一時的なセキュリティ認証情報を使用します。IAM ロールは、第三者が長期的認証情報 (IAM ユーザーアクセスキーなど) を共有することなくお客様の AWS リソースにアクセスできるようにするメカニズムです。

IAM ロールを使用して AWS アカウント と Example Corp アカウントと間の信頼関係を確立できます。この関係が確立されると、Example Corp アカウントのメンバーは、AWS Security Token Service [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API を呼び出して、一時的セキュリティ認証情報を取得できます。次に、Example Corp のメンバーは、この認証情報を使用してアカウントの AWS リソースにアクセスできます。

**注記**  
一時的セキュリティ認証情報を取得するために呼び出すことのできる AssumeRole とその他の AWS API オペレーションの詳細については、「[AWS STS 認証情報を比較する](id_credentials_sts-comparison.md)」を参照してください。

このシナリオの詳細は以下のとおりです。

1. お客様は Example Corp を雇うとします。Example Corp はお客様の一意の顧客 ID を作成します。Example Corp はその一意の顧客 ID と Example Corp の AWS アカウント 番号をお客様に提供します。この情報は次の手順でお客様が IAM ロールを作成するために必要になります。
**注記**  
Example Corp は、顧客ごとに一意である限り、任意の文字列値を ExternalId に使用できます。顧客のアカウント番号を使用することもできますし、ランダムな文字列でもかまいません。ただし、2 つの顧客に同じ値を使用することはできません。「シークレット」することを意図したものではありません。Example Corp は、顧客ごとに ExternalId 値を指定する必要があります。重要なのは、各外部IDがユニークであることを確認するために、お客様**によってではなく**、Example Corp によって生成される必要があるということです。

1. お客様は AWS にサインインし、お客様のリソースへのアクセス権を Example Corp に付与する IAM ロールを作成します。他の IAM ロールと同様に、このロールにも 2 つのポリシー (アクセス許可ポリシーと信頼ポリシー) があります。ロールの信頼ポリシーでは、だれがこのロールを引き受けることができるかを指定します。このサンプルシナリオでは、ポリシーで `Principal` として Example Corp の AWS アカウント 番号を指定します。これにより、そのアカウントの ID はロールを引き受けることができるようになります。さらに、信頼ポリシーに `[Condition](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Condition)` 要素を追加します。この `Condition` は `ExternalId` コンテキストキーをテストして、その要素が Example Corp の一意の顧客 ID に一致するようにします。その例を示します。

   ```
       "Principal": {"AWS": "Example Corp's AWS アカウント ID"},
       "Condition": {"StringEquals": {"sts:ExternalId": "Unique ID Assigned by Example Corp"}}
   ```

1. ロールのアクセス許可ポリシーでは、ロールがだれに何を許可するかを指定します。たとえば、お客様の Amazon EC2 と Amazon RDS のリソースのみを管理でき、お客様の IAM ユーザーまたはグループは管理できないようにロールを指定できます。サンプルシナリオでは、アクセス許可ポリシーを使用して、お客様のアカウントのすべてのリソースに対する読み取り専用アクセス権を Example Corp に付与します。

1. ロールの作成が完了したら、そのロールの Amazon リソースネーム（ARN）を Example Corp に提供します。

1. Example Corp がお客様の AWS リソースに対するアクセス許可を必要とするとき、Example Corp の担当者が AWS `sts:AssumeRole` API を呼び出します。この呼び出しには、引き受けるロールの ARN とお客様の顧客 ID に対応する ExternalId パラメータが含まれています。

リクエスト元が Example Corp の AWS アカウント であり、ロール ARN と外部 ID が正しい場合、リクエストは成功します。次に、一時的なセキュリティ認証情報が提供されます。Example Corp はその情報を使用して、お客様のロールが許可している AWS リソースにアクセスできます。

つまり、ロールのポリシーに外部 ID が含まれている場合、そのロールを引き受けるユーザーは、ロールでプリンシパルであり、正しい外部 ID を指定する必要があります。

## 外部 ID の重要なポイント
<a name="id_roles_third-party_key-points"></a>
+ 異なる AWS で複数の顧客をサポートするマルチテナント環境では、AWS アカウント アカウントごとに 1 つの外部 ID を使用することをお勧めします。この ID は、サードパーティーによって生成されたランダムな文字列である必要があります。
+ ロールを引き受けるときにサードパーティーが外部 ID を提供することを要求するには、ロールの信頼ポリシーを選択した外部 ID で更新します。
+ ロールを引き受けるときに外部 ID を提供するには、AWS CLI または AWS API を使用してそのロールを引き受けます。詳細については、「STS [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API オペレーション」または「STS [assume-role](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html) CLI オペレーション」を参照してください。
+ `ExternalId` の値は、2～1,224 文字で構成されている必要があります。この値は、空白のない英数字にする必要があります。次の記号を含めることもできます。プラス記号 (\$1)、等号 (=)、カンマ (,)、ピリオド (.)、アットマーク (@)、コロン (:)、スラッシュ (/)、およびハイフン (–)。

## その他のリソース
<a name="id_roles_third-party_additional_resources"></a>

第三者が所有する AWS アカウントへのアクセスを提供する方法について詳しく知りたい場合は、以下のリソースを参考にすると便利です。
+ AWS アカウント内で他のユーザーがアクションを実行できるようにする方法については、「[カスタム信頼ポリシーを使用してロールを作成する](id_roles_create_for-custom.md)」を参照してください。
+ ロールを切り替えるアクセス許可を付与する方法については、「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。
+ 信頼できるユーザーを作成して一時的なセキュリティ認証情報を提供する方法については、「[一時的なセキュリティ認証情報のアクセス許可](id_credentials_temp_control-access.md)」を参照してください。

# AWS サービスへのアクセス
<a name="id_roles_common-scenarios_services"></a>

多くの AWS のサービスでは、ロールを使用して、そのサービスがアクセスできものを制御する必要があります。サービスがお客様に代わってアクションを実行するために引き受けるロールは、[サービスロール](id_roles.md#iam-term-service-role)と呼ばれます。ロールにサービスに対して特殊な目的がある場合、そのロールは[サービスにリンクされたロール](id_roles.md#iam-term-service-linked-role)として分類できます。特定のサービスがロールを使用するかどうかと、使用するサービスのロールを割り当てる方法については、各サービスの [AWS ドキュメント](https://docs.aws.amazon.com/)を参照してください。

AWS が提供するサービスへのアクセスを委任するロールの作成については、「[AWS サービスにアクセス許可を委任するロールを作成する](id_roles_create_for-service.md)」を参照してください。

# 外部で認証されたユーザーへのアクセス (ID フェデレーション)
<a name="id_roles_common-scenarios_federated-users"></a>

社内のディレクトリなど、AWS 以外の ID をユーザーがすでに持っているとします。それらのユーザーが AWS リソースを使用する (または、それらのリソースにアクセスするアプリケーションを使用する) 必要がある場合、それらのユーザーには AWS セキュリティ認証情報も必要です。IAM ロールを使用して、ID が組織または第三者のプロバイダー (IdP) からフェデレーションされたユーザーのアクセス許可を指定できます。

**注記**  
セキュリティ上のベストプラクティスとして、IAM ユーザーを作成する代わりに、ID フェデレーションを使用して [IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/what-is.html) でユーザーアクセスを管理することをお勧めします。IAM ユーザーが必要な特定の状況についての情報は、「[IAMユーザー (ロールの代わりに) を作成する場合](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html#id_which-to-choose)」を参照してください。

## Amazon Cognito を使用したモバイルまたはウェブベースのアプリのユーザーのフェデレーション
<a name="id_roles_common-scenarios_federated-users-cognito"></a>

AWS リソースにアクセスするモバイルまたはウェブベースのアプリを作成する場合、アプリが AWS にプログラムによるリクエストを送るには認証情報が必要になります。ほとんどのモバイルアプリケーションのシナリオでは、[Amazon Cognito](https://aws.amazon.com/cognito/) の使用をお勧めします。このサービスを [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/) および [AWS Mobile SDK for Android and Fire OS](https://aws.amazon.com/sdkforandroid/) で使用して、ユーザーの一意のIDを作成し、AWS リソースへの安全なアクセスのためにユーザーを認証できます。Amazon Cognito では、次のセクションに示されているのと同じ ID プロバイダーがサポートされます。さらに、[開発者が認証した ID](https://aws.amazon.com/blogs/mobile/amazon-cognito-announcing-developer-authenticated-identities) と認証されていない (ゲスト) アクセスもサポートされます。また、Amazon Cognito には、ユーザーがデバイスを変えてもデータが保持されるように、ユーザーデータを同期するための API オペレーションも用意されています。詳細については、「[モバイルアプリのための Amazon Cognito](id_federation_common_scenarios.md#id_roles_providers_oidc_cognito)」を参照してください。

## パブリック ID サービスプロバイダーまたは OpenID Connect を使用したユーザーのフェデレーション
<a name="id_roles_common-scenarios_federated-users-openId"></a>

可能な限り、モバイルおよびウェブベースのアプリケーションシナリオで Amazon Cognito を使用してください。Amazon Cognito は、パブリック ID プロバイダーサービスを使用する際の裏方作業をほとんど行います。同じサードパーティのサービスで機能し、また匿名サインインもサポートしています。ただし、より高度なシナリオでは、OpenID Connect (OIDC) と互換性がある Login with Amazon、Facebook、Google、その他 IdP でのログインなど、サードパーティのサービスを直接使用できます。これらのサービスを使用した OIDC フェデレーションの使用についての詳細は、「[OIDC フェデレーション](id_roles_providers_oidc.md)」を参照してください。

## SAML 2.0 を使用したユーザーのフェデレーション
<a name="id_roles_common-scenarios_federated-users-saml20"></a>

組織が既に SAML 2.0 (Security Assertion Markup Language 2.0) をサポートする ID プロバイダーソフトウェアパッケージを使用している場合、ID プロバイダー (IdP) としての組織と、サービスプロバイダーとしての AWS との間に信頼を作成できます。その後、SAML を使用して、AWS マネジメントコンソール へのフェデレーティッドシングルサインオン (SSO) または AWS API オペレーションを呼び出すためのフェデレーションアクセスをユーザーに許可できます。たとえば、社内で Microsoft Active Directory と Active Directory Federation Services を使用している場合は、SAML 2.0 を使用してフェデレーションが可能です。SAML 2.0 を使用したユーザーのフェデレーション方法の詳細については、「[SAML 2.0 フェデレーション](id_roles_providers_saml.md)」を参照してください。

## カスタム ID ブローカーアプリケーションを作成するユーザーのフェデレーション
<a name="id_roles_common-scenarios_federated-users-idbroker"></a>

ID ストアに SAML 2.0 との互換性がない場合、カスタム ID ブローカーアプリケーションを作成して同じような機能を実行できます。ブローカーアプリケーションはユーザーを認証し、そのユーザー用に一時的な認証情報を AWS に要求して、それをユーザーに提供し AWS リソースにアクセスできるようにします。

たとえば、Example Corp. には、会社の AWS リソースにアクセスする社内アプリケーションを実行する必要のある従業員が多数います。従業員は、会社の ID および認証システムに既に ID があり、従業員ごとに別の IAM ユーザーを作成することは望ましくありません。

Bob は Example Corp の開発者です。Example Corp の社内アプリケーションで会社の AWS リソースにアクセスできるようにするために、カスタム ID ブローカーアプリケーションを開発しています。このアプリケーションは、従業員が Example Corp. の既存の ID および認証システムにサインインしていることを確認します。これには、LDAP や Active Directory などのシステムを使用している可能性があります。ID ブローカーアプリケーションは、従業員の一時的なセキュリティ認証情報を取得します。このシナリオは、前のシナリオ（カスタム認証システムを使用するモバイルアプリ）に似ています。ただし、AWS リソースにアクセスする必要のあるアプリケーションはすべて企業ネットワーク内で実行され、会社には既存の認証システムがあります。

一時的なセキュリティ認証情報を取得するために、ID ブローカーアプリケーションは、ユーザーのポリシーの管理方法と一時的な認証情報の有効期限に応じて、`AssumeRole` または `GetFederationToken` を呼び出して、一時的なセキュリティ認証情報を取得します (これらの API オペレーションの違いの詳細については、「[IAM の一時的な認証情報](id_credentials_temp.md)」および「[一時的なセキュリティ認証情報のアクセス許可](id_credentials_temp_control-access.md)」を参照してください)。この呼び出しは、AWS アクセスキー ID、シークレットアクセスキー、およびセッショントークンで構成される一時的なセキュリティ認証情報を返します。ID ブローカーアプリケーションは、これらの一時的なセキュリティ認証情報を社内アプリケーションで使用できるようにします。アプリは、一時的な認証情報を使用して AWS を直接呼び出すことができます。アプリは、認証情報をキャッシュし、有効期限が切れると、新しい一時的な認証情報をリクエストします。このシナリオを以下に図で示します。

![\[カスタム ID ブローカーアプリケーションを使用したワークフローの例\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/enterprise-authentication-with-identity-broker-application.diagram.png)


このシナリオには次の属性があります。
+ ID ブローカーアプリケーションには、一時的なセキュリティ認証情報を作成するために IAM のトークンサービス (STS) API にアクセスする権限があります。
+ ID ブローカーアプリケーションが、従業員が既存の認証システム内で認証されていることを確認できます。
+ ユーザーは、AWS マネジメントコンソールへのアクセスを与える一時的な URL を入手できます（これはシングルサインオンと呼ばれています）。

一時的なセキュリティ認証情報の作成方法の詳細については、「[AWS STS 認証情報を比較する](id_credentials_sts-comparison.md)」を参照してください。AWS マネジメントコンソールへのアクセスを取得する SAML フェデレーティッドプリンシパルの詳細については、「[SAML 2.0 フェデレーティッドプリンシパルを有効にして AWS マネジメントコンソール にアクセス](id_roles_providers_enable-console-saml.md)」を参照してください。

# IAM ロールの作成
<a name="id_roles_create"></a>

ロールを作成するには、AWS マネジメントコンソール、AWS CLI、Tools for Windows PowerShell、または IAM API を使用できます。

AWS マネジメントコンソールを使用する場合は、ウィザードを使用し、一連のステップに従ってロールを作成できます。AWS サービス、AWS アカウント、SAML または OIDC のフェデレーティッドプリンシパルのいずれか向けにロールを作成するかにより、ウィザードの手順が多少異なります。

**IAM ユーザーに対するロール**  
自分の AWS アカウント内か、自分が所有する他の AWS アカウントに定義されているロールにアクセス許可を委任する場合に、このロールを作成します。あるアカウントのユーザーは、同じアカウントまたは別のアカウントのロールに切り替えることができます。そのロールを使用している間、ユーザーはアクションだけを実行して、ロールによって許可されているリソースのみにアクセスできますが、元のユーザーアクセス権限は停止されます。ユーザーがそのロールを終了すると、元のユーザーのアクセス権限に戻ります。

詳細については、「[IAM ユーザーにアクセス許可を付与するロールを作成する](id_roles_create_for-user.md)」を参照してください。

クロスアカウントアクセス用のロールの作成の詳細については、「[カスタム信頼ポリシーを使用してロールを作成する](id_roles_create_for-custom.md)」を参照してください。

**AWS サービスに対するロール**  
自分に代わってアクションを実行できるサービスにアクセス許可を委任する場合に、このロールを作成します。[サービスロール](id_roles.md#iam-term-service-role)をサービスに渡す場合は、そのロールの IAM ポリシーにアクセス許可を設定して、サービスが自身に関連付けられているアクションを実行できるようにします。AWS サービスごとに異なるアクセス許可が必要です。

サービスロールの作成の詳細については、「[AWS サービスにアクセス許可を委任するロールを作成する](id_roles_create_for-service.md)」を参照してください。

サービスにリンクされたロールの作成の詳細については、「[サービスにリンクされたロールの作成](id_roles_create-service-linked-role.md)」を参照してください。

**ID フェデレーションに対するロール**  
AWS の外部に既に ID を持っているユーザーにアクセス許可を委任する場合に、このロールを作成します。ID プロバイダーを使用すると、カスタムサインインコードを作成したり独自のユーザー ID を管理したりする必要がありません。外部ユーザーは IdP を使用してサインインします。これらの外部 ID に、アカウントの AWS リソースを使用するアクセス許可を与えることができます。ID プロバイダーは、アプリケーションと共にアクセスキーのような長期的セキュリティ認証情報を配布したり埋め込んだりする必要がないので、AWS アカウントの安全性の維持に役立ちます。

詳細については、「[サードパーティー ID プロバイダーにロールを作成する](id_roles_create_for-idp.md)」を参照してください。

# IAM ユーザーにアクセス許可を付与するロールを作成する
<a name="id_roles_create_for-user"></a>

IAM ロールを使用することで、お客様の AWS リソースに対するアクセス許可を提供できます。IAM ロールにより、お客様の*信頼する*アカウントと他の AWS *信頼される* アカウントとの信頼関係を確立できます。信頼するアカウントは、アクセスされるリソースを所有し、信頼されるアカウントは、リソースへのアクセスを必要とするユーザーを含みます。ただし、別のアカウントがお客様のアカウントのリソースを所有する場合があります。たとえば、信頼するアカウントが、新しいリソースの作成 (Amazon S3 バケットでの新しいオブジェクトの作成など) を、信頼されたアカウントに許可する場合があります。この場合、リソースを作成したアカウントがリソースを所有します。さらに、リソースへのアクセスを誰に許可するかも管理します。

信頼関係の作成後、IAM ユーザーまたは信頼されたアカウントのアプリケーションでは AWS Security Token Service (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 オペレーションを使用できます。このオペレーションから提供される一時的なセキュリティ認証情報を使用して、お客様のアカウントの AWS リソースにアクセスできます。

いずれものアカウントもお客様が管理できます。または、ユーザーが属するアカウントは第三者が管理できます。ユーザーが属する他のアカウントが管理対象外の AWS アカウント である場合は、`externalId` 属性を使用することもできます。外部 ID は、お客様とサードパーティーのアカウントの管理者との間で同意した任意の単語または数値です。このオプションにより、リクエストに正しい `sts:ExternalID` が含まれている場合にのみユーザーがロールを引き受けることができるという条件が、信頼ポリシーに自動的に追加されます。詳細については、「[第三者が所有する AWS アカウント へのアクセス](id_roles_common-scenarios_third-party.md)」を参照してください。

ロールを使用してアクセス権限を委任する方法の詳細については、「[ロールに関する用語と概念](id_roles.md#id_roles_terms-and-concepts)」を参照してください。サービスロールを使用して、サービスからアカウントのリソースへのアクセスを許可する方法については、「[AWS サービスにアクセス許可を委任するロールを作成する](id_roles_create_for-service.md)」を参照してください。

## IAM ロールの作成（コンソール）
<a name="roles-creatingrole-user-console"></a>

IAM ユーザーが引き受けるロールは、AWS マネジメントコンソール を使用して作成できます。例えば、組織で複数の AWS アカウント を使用して本稼働環境から開発環境を分離しているとします。この場合、開発用アカウントのユーザーに対して、本番稼働用アカウントのリソースへのアクセスを許可するロールを作成する方法の概要情報については、「[個別の開発用アカウントと本稼働用アカウントを使用したシナリオ例](id_roles_common-scenarios_aws-accounts.md#id_roles_common-scenarios_aws-accounts-example)」を参照してください。

**最小アクセス許可**  
次の手順を実行するには、少なくとも以下のIAM アクセス許可が必要です。  
`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. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. コンソールのナビゲーションペインで、**[ロール]**、**[ロールの作成]** の順に選択します。

1. **[AWS アカウント]** のロールタイプを選択します。

1. アカウントのロールを作成するには、**[このアカウント]** を選択します。別のアカウントのロールを作成するには、[**別の AWS アカウント**] を選択し、リソースへのアクセス許可を付与する **[アカウント ID]** を入力します。

   指定したアカウントの管理者は、そのアカウントのすべての IAM ユーザーに、このロールを引き受ける許可を付与できます。そのためには、管理者から `sts:AssumeRole` アクションの許可を付与するユーザーまたはグループにポリシーを添付します。そのポリシーで、`Resource` としてロールの ARN を指定する必要があります。

1. 管理対象外のアカウントのユーザーにアクセス許可を付与し、このロールをユーザーがプログラムで引き受ける場合は、**[外部 ID が必要]** を選択します。外部 ID は、お客様とサードパーティーのアカウントの管理者との間で同意した任意の単語または数値です。このオプションにより、リクエストに正しい `sts:ExternalID` が含まれている場合にのみユーザーがロールを引き受けることができるという条件が、信頼ポリシーに自動的に追加されます。詳細については、「[第三者が所有する AWS アカウント へのアクセス](id_roles_common-scenarios_third-party.md)」を参照してください。
**重要**  
このオプションを選択すると、AWS CLI、Tools for Windows PowerShell、または AWS API からのみの、ロールへのアクセスが制限されます。これは、AWS コンソールを使用して、その信頼ポリシーに `externalId` 条件が指定されているロールに切り替えることができないためです。ただし、関連するSDKを使用してスクリプトまたはアプリケーションを作成することで、この種のアクセスをプログラムで作成できます。詳細とサンプルスクリプトについては、AWS マネジメントコンソール セキュリティブログの「[AWS へのクロスアカウントアクセスを有効にする方法](https://aws.amazon.com/blogs/security/how-to-enable-cross-account-access-to-the-aws-management-console)」を参照してください。

1. 多要素認証 (MFA) を使用してサインインするユーザーのロールを制限するには、**[MFA が必要]** を選択します。これにより、MFA によるサインインの有無を確認する条件がロールの信頼ポリシーに追加されます。ロールを引き受けるユーザーは、設定した MFA デバイスから一時的なワンタイムパスワードを使用してサインインする必要があります。MFA 認証のないユーザーはロールを引き受けることができません。MFA の詳細については、「[IAM の AWS 多要素認証](id_credentials_mfa.md)」を参照してください。

1. **[次へ]** を選択します。

1. IAM には、アカウント内の AWS 管理ポリシーとカスタマー管理ポリシーのリストがあります。アクセス許可ポリシーとして使用するポリシーを選択するか、**[ポリシーの作成]** を選択して新しいブラウザタブを開き、新しいポリシーをゼロから作成します。詳細については、「[IAM ポリシーの作成](access_policies_create-console.md#access_policies_create-start)」を参照してください。ポリシーを作成したら、そのタブを閉じて元のタブに戻ります。ロールを引き受けるユーザーに許可するアクセス許可ポリシーの横にあるチェックボックスをオンにします。必要に応じて、この時点でポリシーを選択せずに、後でポリシーをロールにアタッチすることもできます。デフォルトでは、ロールにはいずれのアクセス権限もありません。

1. (オプション) [アクセス許可の境界](access_policies_boundaries.md)を設定します。これはアドバンスド機能です。

   **[アクセス許可の境界の設定]** セクションを開き、**[アクセス許可の境界を使用してロールのアクセス許可の上限を設定する]** を選択します。アクセス許可の境界として使用するポリシーを選択します。

1. [**次へ**] を選択します。

1. **ロール名** に、ロールの名前を入力します。ロール名は AWS アカウント アカウント内で一意である必要があります。ロール名がポリシーまたは ARN の一部として使用される場合、ロール名は大文字と小文字が区別されます。サインイン処理中など、コンソールでロール名がユーザーに表示される場合、ロール名は大文字と小文字を区別しません。さまざまなエンティティがロールを参照する可能性があるため、作成後にロール名を編集することはできません。

1. (オプション) **[説明]** には、新しいロールの説明を入力します。

1. **[ステップ 1: 信頼済みエンティティの選択]** または **[ステップ 2: 権限の追加]** のセクションで **[編集]** を選択し、ロールのユースケースと権限を変更します。前のページに戻って編集を行います。

1. (オプション) タグをキーバリューのペアとしてアタッチして、メタデータをロールに追加します。IAM におけるタグの使用の詳細については、「[AWS Identity and Access Management リソースのタグ](id_tags.md)」を参照してください。

1. ロール情報を確認し、**ロールの作成** を選択します。
**重要**  
上記の手順は、必要となる設定の前半であることに注意してください。信頼されたアカウントの各ユーザーに対して、コンソールでロールを切り替えるか、プログラムでロールを引き受けるためのアクセス許可も付与する必要があります。この手順の詳細については、「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。

------

## IAM ロール (AWS CLI) の作成
<a name="roles-creatingrole-user-cli"></a>

AWS CLI を使用したロールの作成には、複数のステップがあります。コンソールを使用してロールを作成する場合、多くのステップは自動的に行われますが、AWS CLI を使用する場合は、各ステップを明示的に実行する必要があります。ロールを作成して、これにアクセス許可ポリシーを割り当てる必要があります。必要に応じて、ロールの[アクセス許可の境界](access_policies_boundaries.md)を設定することもできます。

**クロスアカウントアクセス用のロールを作成するには (AWS CLI)**

1. ロール [aws iam create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html) を作成します。

1. マネージドアクセス許可ポリシー [aws iam attach-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html) をロールにアタッチします。

    または

   ロールのインラインアクセス許可ポリシー[aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html) を作成します。

1. (オプション) タグ ([aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)) をアタッチして、カスタム属性をロールに追加します。

   詳細については、「[IAM ロールのタグの管理 (AWS CLI または AWS API)](id_tags_roles.md#id_tags_roles_procs-cli-api)」を参照してください。

1. (オプション) ロールの[アクセス許可の境界](access_policies_boundaries.md) [aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html) を設定します。

   アクセス許可の境界では、ロールに許可されるアクセス許可の上限を設定します。アクセス許可の境界は AWS のアドバンスド機能です。

次の例では、シンプルな環境でクロスアカウントロールを作成するための最初の 2 つのステップ (最も一般的なステップ) を示します。この例では、`123456789012` アカウントの任意のユーザーに、ロールを引き受けて Amazon S3 バケット `example_bucket` を表示することを許可します。また、この例では、Windows を実行しているクライアントコンピュータを使用中であり、アカウントの認証情報とリージョンを使ってコマンドラインインターフェイスを設定済みであることを前提とします。詳細については、「[AWS コマンドラインインターフェイスの設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)」を参照してください。

この例では、ロールの作成時に、次の信頼ポリシーを最初のコマンドに含めます。この信頼ポリシーでは、`123456789012` アカウントのユーザーに対して、`AssumeRole` オペレーションを使用してロールを引き受けることを許可します。ただし、ユーザーが `SerialNumber` パラメータと `TokenCode` パラメータを使用して MFA 認証を提供することを条件とします。MFA の詳細については、「[IAM の AWS 多要素認証](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" } }
      }
  ]
}
```

------

**重要**  
`Principal` 要素に特定の IAM ロールまたはユーザーの ARN が含まれている場合、この ARN はポリシーの保存時に一意のプリンシパル ID に変換されます。これにより、第三者がロールやユーザーを削除して再作成することで、そのユーザーのアクセス許可をエスカレートするリスクを緩和できます。通常、この ID はコンソールには表示されません。信頼ポリシーが表示されるときに、ARN への逆変換が行われるためです。ただし、ロールまたはユーザーを削除すると、プリンシパル ID はコンソールに表示されます。これは、AWS が ARN に ID をマッピングできなくなるためです。したがって、信頼ポリシーの `Principal` 要素で指し示しているユーザーまたはロールを削除し、再作成する場合、ロールを編集して ARN を置き換える必要があります。

2 番目のコマンドを使用する場合、既存の管理ポリシーをロールにアタッチする必要があります。以下のアクセス許可ポリシーでは、`example_bucket` Amazon S3 バケット に対して `ListBucket` アクションのみを実行することを、ロールを引き受ける任意のユーザーに許可します。

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

****  

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

------

この `Test-UserAccess-Role` ロールを作成するには、まず以前の信頼ポリシーを `trustpolicyforacct123456789012.json` という名前でローカル `policies` ドライブの `C:` フォルダに保存する必要があります。次に、以前のアクセス許可ポリシーを `PolicyForRole` という名前のカスタマー管理ポリシーとして AWS アカウント に保存します。次に、以下のコマンドを使用してロールを作成し、管理ポリシーをアタッチできます。

```
# 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
```

**重要**  
上記の手順は、必要となる設定の前半であることに注意してください。信頼されたアカウントに属している個々のユーザーに、ロールを切り替えるアクセス権限を付与する必要もあります。この手順の詳細については、「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。

ロールを作成し、このロールに AWS タスクの実行や AWS リソースへのアクセスに必要なアクセス許可を付与すると、`123456789012` アカウントのユーザーはこのロールを引き受けることができます。詳細については、「[IAM ロールに切り替える (AWS CLI)](id_roles_use_switch-role-cli.md)」を参照してください。

## IAM ロール（AWS API) の作成
<a name="roles-creatingrole-user-api"></a>

AWS API からロールを作成するには、複数のステップが必要です。コンソールでロールを作成する場合は多くのステップが自動的に実行されますが、API では各ステップを手動で明示的に実行する必要があります。ロールを作成して、これにアクセス許可ポリシーを割り当てる必要があります。必要に応じて、ロールの[アクセス許可の境界](access_policies_boundaries.md)を設定することもできます。

**コードでロールを作成するには (AWS API)**

1. ロールとして [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) を作成します。

   ロールの信頼ポリシーに対して、ファイルの場所を指定できます。

1. マネージドアクセス許可ポリシー [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html) をロールにアタッチします。

   または

   ロールのインラインアクセス許可ポリシー [PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html) を作成します。
**重要**  
上記の手順は、必要となる設定の前半であることに注意してください。信頼されたアカウントに属している個々のユーザーに、ロールを切り替えるアクセス権限を付与する必要もあります。この手順の詳細については、「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。

1. (オプション) タグ ([TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)) をアタッチして、カスタム属性をユーザーに追加します。

   詳細については、「[IAM ユーザーのタグの管理 ( AWS CLI または AWS API)](id_tags_users.md#id_tags_users_procs-cli-api)」を参照してください。

1. (オプション) ロールの[アクセス許可の境界](access_policies_boundaries.md) [PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html) を設定します。

   アクセス許可の境界では、ロールに許可されるアクセス許可の上限を設定します。アクセス許可の境界は AWS のアドバンスド機能です。

ロールを作成し、このロールに AWS タスクの実行や AWS リソースへのアクセスに必要なアクセス許可を付与したら、アカウントのユーザーにアクセス許可を付与して、このロールを引き受けることを許可する必要があります。ロールの引き受けに関する詳細については、「[IAM ロールを切り替える (AWS)](id_roles_use_switch-role-api.md)」を参照してください。

## IAM ロール (AWS CloudFormation) の作成
<a name="roles_creatingrole-user-cloudformation"></a>

AWS CloudFormation での IAM ロールの作成については、[AWS CloudFormationユーザガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html)の「[リソースとプロパティのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#aws-resource-iam-role--examples) 」および「*例*」を参照してください 。

AWS CloudFormation の IAM テンプレートの詳細については、「AWS CloudFormation ユーザガイド」の「[AWS Identity and Access Management テンプレートスニペット](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-iam.html)」を参照してください。

# AWS サービスにアクセス許可を委任するロールを作成する
<a name="id_roles_create_for-service"></a>

AWS の多くのサービスでは、ロールを使用して、ユーザーに代わって該当サービスが他のサービスのリソースにアクセスすることを許可する必要があります。サービスがお客様に代わってアクションを実行するために引き受けるロールは、[サービスロール](id_roles.md#iam-term-service-role)と呼ばれます。ロールがサービスの特殊な目的を果たす場合、そのロールは[サービスにリンクされたロール](id_roles.md#iam-term-service-linked-role)として分類されます。どのサービスがサービスにリンクされたロールの使用をサポートしているのか、またはサービスがあらゆる形式の一時的な認証情報をサポートしているのか確認するには「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」をご覧ください。サービスがそれぞれロールをどのように使用するのか把握するには、テーブル内のサービス名を選択し、そのサービスに関するドキュメントをご覧ください。

`PassRole` アクセス許可を設定する場合、ユーザーがロールに必要以上のアクセス許可があるロールを渡さないようにする必要があります。例えば、Alice が Amazon S3 アクションを実行する許可を持っていない場合があります。Alice が Amazon S3 アクションを許可するサービスにロールを渡すことができる場合、サービスはジョブの実行時に、Alice に代わって Amazon S3 アクションを実行できます。

ロールを使用してアクセス許可を委任する方法の詳細については、「[ロールに関する用語と概念](id_roles.md#id_roles_terms-and-concepts)」を参照してください。

## サービスロールのアクセス許可
<a name="id_roles_create_service-permissions"></a>

IAM エンティティ (ユーザーまたはロール) がサービスロールを作成または編集できるようにするには、アクセス許可を設定する必要があります。

**注記**  
サービスにリンクされたロールの ARN にはサービスプリンシパルが含まれています。以下のポリシーでは `SERVICE-NAME.amazonaws.com` として示されています。サービスプリンシパルは推量しないでください。サービスプリンシパルは、大文字と小文字が区別され、AWS のサービス間で異なる場合があります。サービスのサービスプリンシパルを表示するには、そのサービスにリンクされたロールのドキュメントを参照してください。

**IAM エンティティが特定のサービスロールを作成することを許可するには**

サービスロールを作成する必要のある IAM エンティティに、以下のポリシーを追加します。このポリシーでは、指定したサービスおよび特定の名前のサービスロールの作成を許可します。管理ポリシーまたはインラインポリシーをそのロールにアタッチできます。

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

****  

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

------

**IAM エンティティが任意のサービスロールを作成することを許可するには**

AWS では、管理者ユーザーのみにサービスロールの作成を許可することをお勧めします。ロールの作成とポリシーのアタッチを許可されたユーザーは、自分のアクセス許可をエスカレートできます。代わりに、彼らが必要とするロールの作成のみを許可したポリシーを作成するか、彼らの代わりに、管理者にサービスロールを作成させます。

管理者が AWS アカウント 全体にアクセスできるポリシーをアタッチするには、[AdministratorAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AdministratorAccess)AWS 管理ポリシーを使用します。

**IAM エンティティにサービスロールの編集を許可するには**

サービスロールを編集する必要のある IAM エンティティに、以下のポリシーを追加します。

------
#### [ 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": "*"
        }
    ]
}
```

------

**IAM エンティティが特定のサービスロールを削除することを許可するには**

指定したサービスロールを削除する必要のある IAM エンティティのアクセス許可ポリシーに、以下のステートメントを追加します。

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

**IAM エンティティがサービスロールを削除することを許可するには**

AWS では、管理者ユーザーのみにサービスロールの削除を許可することをお勧めします。代わりに、彼らが必要とするロールの削除のみを許可したポリシーを作成するか、彼らの代わりに、管理者にサービスロールを削除させます。

管理者が AWS アカウント 全体にアクセスできるポリシーをアタッチするには、[AdministratorAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AdministratorAccess)AWS 管理ポリシーを使用します。

## AWS のサービス用ロールの作成 (コンソール)
<a name="roles-creatingrole-service-console"></a>

サービス用のロールを作成するには、AWS マネジメントコンソール を使用します。一部のサービスでは、複数のサービスロールがサポートされているため、該当サービスの「[AWS ドキュメント](https://docs.aws.amazon.com/)」を参照の上、選択するユースケースを確認してください。必要な信頼ポリシーとアクセス権限ポリシーを割り当て、サービスがお客様に代わってロールを引き受ける方法について説明します。ロールのアクセス許可を管理するために使用できるステップは、サービスでユースケースを定義する方法や、サービスにリンクされたロールを作成するかどうかに応じて異なります。

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

**AWS のサービス (IAM コンソール) のロールを作成するには**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. IAM コンソールのナビゲーションペインで、**[ロール]**、**[ロールを作成]** を選択します。

1. **信頼できるエンティティタイプ** で、**AWS のサービス** を選択します。

1. **[サービスまたはユースケース]** でサービスを選択し、次にユースケースを選択します。ユースケースは、サービスに必要な信頼ポリシーを含める定義になります。

1. [**次へ**] を選択します。

1. **[アクセス許可ポリシー]** では、オプションは選択したユースケースによって異なります。
   + サービスがロールのアクセス許可を定義している場合、アクセス許可ポリシーを選択することはできません。
   + 制限されたアクセス許可ポリシーのセットから選択します。
   + すべてのアクセス許可ポリシーから選択します。
   + アクセス許可ポリシーを選択するのではなく、ロールの作成後にポリシーを作成し、そのポリシーをロールにアタッチします。

1. (オプション) [アクセス許可の境界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)を設定します。このアドバンスド機能は、サービスロールで使用できますが、サービスにリンクされたロールではありません。

   1. **[アクセス許可の境界の設定]** セクションを開き、**[アクセス許可の境界を使用してロールのアクセス許可の上限を設定する]** を選択します。

      IAM には、アカウント内の AWS 管理ポリシーとカスタマー管理ポリシーのリストがあります。

   1. アクセス許可の境界として使用するポリシーを選択します。

1. [**次へ**] を選択します。

1. **[ロール名]** では、オプションはサービスによって異なります。
   + サービスでロール名が定義されている場合、ロール名を編集することはできません。
   + サービスでロール名のプレフィックスが定義されている場合、オプションのサフィックスを入力できます。
   + サービスでロール名が定義されていない場合、ロールに名前を付けることができます。
**重要**  
ロールに名前を付けるときは、次のことに注意してください。  
ロール名は AWS アカウント内で一意である必要があります。ただし、大文字と小文字は区別されません。  
例えば、**PRODROLE** と **prodrole** の両方の名前でロールを作成することはできません。ロール名がポリシーまたは ARN の一部として使用される場合、ロール名は大文字と小文字が区別されます。ただし、サインインプロセスなど、コンソールにロール名がユーザーに表示される場合、ロール名は大文字と小文字が区別されません。
他のエンティティがロールを参照する可能性があるため、ロールを作成した後にロール名を編集することはできません。

1. (オプション) **[説明]** にロールの説明を入力します。

1. (オプション) ロールのユースケースとアクセス許可を編集するには、**[ステップ 1: 信頼されたエンティティを選択]** または **[ステップ 2: アクセス権限を追加]** のセクションで **[編集]** を選択します。

1. (オプション) ロールの識別、整理、検索を簡単にするには、キーと値のペアとしてタグを追加します。IAM でのタグの使用の詳細については、「*IAM ユーザーガイド*」の「[AWS Identity and Access Management リソースのタグ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)」を参照してください。

1. ロールを確認したら、**[ロールを作成]** を選択します。

------

## サービス用のロールを作成する (AWS CLI)
<a name="roles-creatingrole-service-cli"></a>

AWS CLI を使用したロールの作成には、複数のステップがあります。コンソールを使用してロールを作成する場合、多くのステップは自動的に行われますが、AWS CLI を使用する場合は、各ステップを明示的に実行する必要があります。ロールを作成して、これにアクセス許可ポリシーを割り当てる必要があります。使用しているサービスが Amazon EC2 の場合は、インスタンスプロファイルも作成してロールを追加する必要があります。必要に応じて、ロールの[アクセス許可の境界](access_policies_boundaries.md)を設定することもできます。

**AWS のサービスのロールを AWS CLI で作成するには**

1. 次の `[create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html)` コマンドは、*Test-Role* という名前のロールを作成し、それに信頼ポリシーをアタッチします。

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

1. マネージドアクセス許可ポリシー [aws iam attach-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html) をロールにアタッチします。

   たとえば、次の `attach-role-policy` コマンドは、AWS と呼ばれる `ReadOnlyAccess` 管理ポリシーIAM ロールを `ReadOnlyRole` と呼ばれる IAM ロールロールにアタッチします。

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

    または

   ロールのインラインアクセス許可ポリシー[aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html) を作成します。

   インラインアクセス許可ポリシーの追加については、以下の例を参照してください。

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

1. (オプション) タグ ([aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)) をアタッチして、カスタム属性をロールに追加します。

   詳細については、「[IAM ロールのタグの管理 (AWS CLI または AWS API)](id_tags_roles.md#id_tags_roles_procs-cli-api)」を参照してください。

1. (オプション) ロールの[アクセス許可の境界](access_policies_boundaries.md) [aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html) を設定します。

   アクセス許可の境界では、ロールに許可されるアクセス許可の上限を設定します。アクセス許可の境界は AWS のアドバンスド機能です。

ロールを Amazon EC2 で使用する場合や、Amazon EC2 を使用する AWS の別のサービスで使用する場合は、ロールをインスタンスプロファイルに保存する必要があります。インスタンスプロファイルは、Amazon EC2 インスタンスの起動時にインスタンスにアタッチできるロールのコンテナです。インスタンスプロファイルに含めることができる ロールは 1 つのみであり、緩和できません。AWS マネジメントコンソールを使用してロールを作成すると、ロールと同じ名前のインスタンスプロファイルが自動的に作成されます。インスタンスプロファイルの詳細については、「[インスタンスプロファイルを使用する](id_roles_use_switch-role-ec2_instance-profiles.md)」を参照してください。ロールを使用して EC2 インスタンスを起動する方法については、「Amazon EC2 ユーザーガイド」の [Amazon EC2 リソースへのアクセスの制御](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances)に関するページを参照してください。

**インスタンスプロファイルを作成し、これにロールを保存するには (AWS CLI)**

1. インスタンスプロファイル [aws iam create-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/create-instance-profile.html) を作成します。

1. ロールをインスタンスプロファイル [aws iam add-role-to-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/add-role-to-instance-profile.html) に追加します。

次に示す AWS CLI のコマンド例では、ロールを作成してアクセス許可をアタッチする手順の最初の 2 つのステップを示します。また、インスタンスプロファイルを作成し、これにロールを追加する手順の最初の 2 つのステップも示します。この信頼ポリシー例では、ロールを引き受けて Amazon S3 バケット `example_bucket` を表示することを Amazon EC2 サービスに許可します。また、この例では、Windows を実行するクライアントコンピュータを使用中であり、アカウントの認証情報とリージョンを使ってコマンドラインインターフェイスを設定済みであることを前提とします。詳細については、「[AWS コマンドラインインターフェイスの設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)」を参照してください。

この例では、ロールの作成時に、次の信頼ポリシーを最初のコマンドに含めます。この信頼ポリシーにより、Amazon EC2 サービスはロールを引き受けることを許可されます。

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

****  

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

------

2 番目のコマンドを使用する場合、アクセス許可ポリシーをロールにアタッチする必要があります。次のアクセス許可ポリシーの例では、Amazon S3 バケット `ListBucket` に対して `example_bucket` アクションのみを実行することをロールに許可します。

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

****  

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

------

この `Test-Role-for-EC2` ロールを作成するには、まず前の信頼ポリシーを `trustpolicyforec2.json` という名前で、前のアクセス許可ポリシーを `permissionspolicyforec2.json` という名前で、ローカル `C:` ドライブの `policies` ディレクトリに保存する必要があります。次に、以下のコマンドを使用して、ロールの作成、ポリシーのアタッチ、インスタンスプロファイルの作成、およびインスタンスプロファイルへのロールの追加を行います。

```
# 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
```

EC2 インスタンスを起動するとき、AWS コンソールを使用する場合は、[**インスタンスの詳細の設定**] ページでインスタンスプロファイル名を指定します。`aws ec2 run-instances` CLI コマンドを使用する場合は、`--iam-instance-profile` パラメータを指定します。

## サービス用のロールを作成する (AWS API)
<a name="roles-creatingrole-service-api"></a>

AWS API からロールを作成するには、複数のステップが必要です。コンソールでロールを作成する場合は多くのステップが自動的に実行されますが、API では各ステップを手動で明示的に実行する必要があります。ロールを作成して、これにアクセス許可ポリシーを割り当てる必要があります。使用しているサービスが Amazon EC2 の場合は、インスタンスプロファイルも作成してロールを追加する必要があります。必要に応じて、ロールの[アクセス許可の境界](access_policies_boundaries.md)を設定することもできます。

**AWS のサービスのロールを作成するには (AWS API)**

1. ロールとして [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) を作成します。

   ロールの信頼ポリシーに対して、ファイルの場所を指定できます。

1. ロールに管理アクセス許可ポリシーをアタッチします: [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)

    または

   ロールのインラインアクセス許可ポリシー [PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html) を作成します。

1. (オプション) タグ ([TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)) をアタッチして、カスタム属性をユーザーに追加します。

   詳細については、「[IAM ユーザーのタグの管理 ( AWS CLI または AWS API)](id_tags_users.md#id_tags_users_procs-cli-api)」を参照してください。

1. (オプション) ロールの[アクセス許可の境界](access_policies_boundaries.md) [PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html) を設定します。

   アクセス許可の境界では、ロールに許可されるアクセス許可の上限を設定します。アクセス許可の境界は AWS のアドバンスド機能です。

ロールを Amazon EC2 で使用する場合や、Amazon EC2 を使用する AWS の別のサービスで使用する場合は、ロールをインスタンスプロファイルに保存する必要があります。インスタンスプロファイルは、ロールのコンテナとして機能します。各インスタンスプロファイルに含めることができるロールは 1 つのみであり、増やすことはできません。AWS マネジメントコンソールでロールを作成すると、ロールと同じ名前のインスタンスプロファイルが自動的に作成されます。インスタンスプロファイルの詳細については、「[インスタンスプロファイルを使用する](id_roles_use_switch-role-ec2_instance-profiles.md)」を参照してください。ロールを使用して Amazon EC2 インスタンスを起動する方法については、「Amazon EC2 ユーザーガイド」の [Amazon EC2 リソースへのアクセスの制御](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances)に関するページを参照してください。

**インスタンスプロファイルを作成し、これにロールを保存するには (AWS API)**

1. インスタンスプロファイル [CreateInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html) を作成します。

1. ロールをインスタンスプロファイル [AddRoleToInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddRoleToInstanceProfile.html) に追加します。

# サービスにリンクされたロールの作成
<a name="id_roles_create-service-linked-role"></a>

サービスにリンクされたロールは、AWS のサービスに直接リンクされた一意のタイプの IAM ロールです。サービスにリンクされたロールは、サービスによって事前定義されており、お客様の代わりにサービスから他の AWS サービスを呼び出す必要のあるアクセス権限がすべて含まれています。このリンクされたサービスでも、サービスにリンクされたロールを作成、変更、削除する方法を定義しています。サービスによって、ロールが自動的に作成または削除される場合があります。そのため、ウィザードの一部、またはサービスのプロセスとして、ロールを作成、変更、削除できる場合があります。または、ロールを作成または削除するには、IAM を使用する必要がある場合があります。どの方法を使用するにしても、サービスにリンクされたロールを使用すると、サービスが自動でアクションを完了させるのに、 アクセス許可を手動で追加する必要がないため、サービスの設定プロセスが簡単になります。

**注記**  
サービスロールは、サービスにリンクされたロールとは異なることに注意してください。サービスロールとは、サービスがユーザーに代わってアクションを実行するために引き受ける [IAM ロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)です。IAM 管理者は、IAM 内からサービスロールを作成、変更、削除できます。詳細については、「*IAM ユーザーガイド*」の「[AWS のサービス に許可を委任するロールを作成する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)」を参照してください。サービスにリンクされたロールは、AWS のサービス にリンクされているサービスロールの一種です。サービスがロールを引き受け、ユーザーに代わってアクションを実行できるようになります。サービスにリンクされたロールは、AWS アカウント に表示され、サービスによって所有されます。IAM 管理者は、サービスリンクロールのアクセス許可を表示できますが、編集することはできません。

リンクされたサービスで、そのサービスにリンクされたロールのアクセス許可を定義します。特に定義されている場合を除き、ロールは、そのサービスでのみ引き受けることができます。定義される許可は信頼ポリシーと許可ポリシーに含まれており、その許可ポリシーを他の IAM エンティティにアタッチすることはできません。

ロールを削除する前に、最初に関連するリソースを削除する必要があります。これにより、リソースへのアクセス許可を誤って削除してしまうことを防ぐことができます。

**ヒント**  
サービスにリンクされたロールを使用してサポートするサービスについては、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照し、**[サービスにリンクされたロール]** 列が **[はい]** になっているサービスを検索してください。サービスにリンクされたロールに関するドキュメントをサービスで表示するには、**[はい]** リンクを選択します。

## サービスにリンクされたロールのアクセス許可
<a name="service-linked-role-permissions"></a>

ユーザーまたはロールがサービスにリンクされたロールを作成または編集できるようにするには、IAM エンティティ (ユーザーまたはロール) のアクセス許可を設定する必要があります。

**注記**  
サービスにリンクされたロールの ARN にはサービスプリンシパルが含まれています。以下のポリシーでは `SERVICE-NAME.amazonaws.com` として示されています。サービスプリンシパルは推量しないでください。サービスプリンシパルは、大文字と小文字が区別され、AWS のサービス間で異なる場合があります。サービスのサービスプリンシパルを表示するには、そのサービスにリンクされたロールのドキュメントを参照してください。

**特定のサービスにリンクされたロールの作成を IAM エンティティに許可するには**

サービスにリンクされたロールを作成する必要のある IAM エンティティに、次のポリシーを追加します。

------
#### [ 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*"
        }
    ]
}
```

------

**IAM エンティティがサービスにリンクされた任意のロールを作成することを許可するには**

サービスにリンクされたロール、または必要なポリシーを含む任意のサービスロールを作成する必要のある IAM エンティティのアクセス許可ポリシーに、次のステートメントを追加します。このポリシーステートメントでは、IAM エンティティがポリシーをロールにアタッチすることは許可されません。

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

**IAM エンティティが任意のサービスロールの説明を編集することを許可するには**

サービスにリンクされたロール、または任意のサービスロールの説明を編集する必要のある IAM エンティティのアクセス許可ポリシーに、次のステートメントを追加します。

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

**IAM エンティティがサービスにリンクされた特定のロールを削除することを許可するには**

サービスにリンクされたロールを削除する必要のある IAM エンティティのアクセス許可ポリシーに、次のステートメントを追加します。

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

**IAM エンティティがサービスにリンクされた任意のロールを削除することを許可するには**

サービスロールではなく、サービスにリンクされたロールを削除する必要のある IAM エンティティのアクセス許可ポリシーに、以下のステートメントを追加します。

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

**既存のロールをサービスに渡すことを IAM エンティティに許可するには**

一部の AWS サービスでは、新しいサービスにリンクされたロールを作成せずに、既存のロールをサービスに渡すことができます。そのためには、サービスに*ロールを渡す*アクセス許可がユーザーに必要です。ロールを渡す必要のある IAM エンティティのアクセス許可ポリシーに、以下のステートメントを追加します。このポリシーステートメントでは、エンティティは、渡すことができるロールのリストを表示できます。詳細については、「[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"
}
```

## サービスにリンクされたロールによる間接的なアクセス許可
<a name="create-service-linked-role-permissions-transfer"></a>

サービスにリンクされたロールによって付与されたアクセス許可は、他のユーザーおよびロールに間接的に転送できます。サービスにリンクされたロールが AWS サービスによって使用されると、そのサービスにリンクされたロールは独自のアクセス許可を使用して他の AWS サービスを呼び出すことができます。つまり、サービスにリンクされたロールを使用するサービスを呼び出すアクセス許可を持つユーザーとロールは、そのサービスにリンクされたロールがアクセスできるサービスに間接的にアクセスできる可能性があります。

たとえば、Amazon RDS DB インスタンスを作成すると、[RDS のサービスにリンクされたロール](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAM.ServiceLinkedRoles.html)は、まだ存在しない場合は自動的に作成されます。このサービスにリンクされたロールを使用すると、RDS は、ユーザーに代わって Amazon EC2、Amazon SNS、Amazon SNS、Amazon CloudWatch Logs、Amazon Kinesis を呼び出すことを許可します。アカウントのユーザーとロールに RDS データベースの変更や作成を許可すると、RDS を呼び出すことで Amazon EC2、Amazon SNS、Amazon CloudWatch Logs ログ、Amazon Kinesis のリソースと間接的にやり取りできるようになる可能性があります。RDS はサービスにリンクされたロールを使用してこれらのリソースにアクセスするためです。

### サービスにリンクされたロールを作成する方法
<a name="create-service-linked-role"></a>

サービスにリンクされたロールを作成するメソッドは、サービスによって異なります。場合によっては、サービスにリンクされたロールを手動で作成する必要はありません。たとえば、サービス特定のアクション (リソースの作成) を完了すると、サービスによって、サービスにリンクされたロールが作成される場合があります。または、サービスにリンクされたロールのサポートを開始する前からサービスを使用していた場合は、アカウントにロールが自動的に作成される場合があります。詳細については[AWS アカウントに新しいロールが表示される](troubleshoot_roles.md#troubleshoot_roles_new-role-appeared)を参照してください。

また、サービスにリンクされたロールは、サービスコンソール、API、CLI を使用して、手動で作成できる場合があります。サービスにリンクされたロールを使用してサポートするサービスについては、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照し、**[サービスにリンクされたロール]** 列が **[はい]** になっているサービスを検索してください。サービスにリンクされたロールをサービスで作成できるかどうかを確認するには、「**はい**」リンクを選択して、該当サービスのサービスにリンクされたロールに関するドキュメントを参照してください。

ロールの作成がサービスでサポートされていない場合は、IAM を使用して、サービスにリンクされたロールを作成できます。

**重要**  
サービスにリンクされたロールでは、[AWS アカウント の IAM ロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entities)の制限に向かってカウントされますが、このロールは制限を超えてもアカウントに作成することができます。この制限を超える可能性があるのは、サービスにリンクされたロールのみです。

### サービスにリンクされたロールの作成 (コンソール)
<a name="create-service-linked-role-iam-console"></a>

IAM のサービスにリンクされたロールを作成する前に、サービスにリンクされたロールがサービスで自動的に作成されるかどうかを確認します。さらに、サービスのコンソール、API、または CLI からロールを作成できるかどうかも確認します。<a name="create-service-linked-role-iam-console"></a>

**サービスにリンクされたロールを作成するには (コンソール)**

1. AWS マネジメントコンソール にサインインして、IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. IAM コンソールのナビゲーションペインで **[ロール]** を選択します。続いて、**[ロールの作成]** を選択します。

1. **[AWS のサービス]** ロールタイプを選択します。

1. 提供するサービスのユースケースを選択します。ユースケースは、サービスに必要な信頼ポリシーを含めるように定義されています。その後、**[Next]** を選択します。

1. ロールにアタッチするアクセス権限ポリシーを 1 つ以上選択します。選択したユースケースに基づき、サービスで以下のいずれかを行う場合があります。
   + ロールで使用するアクセス権限を定義します。
   + 制限されたアクセス権限からの選択を許可します。
   + すべてのアクセス権限からの選択を許可します。
   + この時点でポリシーを選択できないようにし、ポリシーを作成してからロールにアタッチします。

   ロールに許可する許可を割り当てるポリシーの横にあるチェックボックスを選択し、**[次へ]** を選択します。
**注記**  
設定したアクセス権限は、ロールを使用するすべてのエンティティで有効となります。デフォルトでは、ロールにはいずれのアクセス権限もありません。

1. **[ロール名]** の場合、ロール名のカスタマイズの度合いはサービスによって定義されます。サービスのロール名が定義されている場合、このオプションを変更することはできません。その他の場合、サービスはロールのプレフィックスを定義し、オプションのサフィックスを入力できるようにするかもしれません。

   可能であれば、ロールのデフォルト名に追加するサフィックスを入力します。このサフィックスは、このロールの目的を識別するのに役立ちます。ロール名は AWS アカウント内で一意でなければなりません。大文字と小文字は区別されません。例えば、**<service-linked-role-name>\$1SAMPLE** と **<service-linked-role-name>\$1sample** というロール名を両方作成することはできません。多くのエンティティによりロールが参照されるため、作成後にロール名を変更することはできません。

1. (オプション) **[説明]** で、サービスにリンクされた新しいロールの説明を編集します。

1. 作成中にサービスにリンクされたロールにタグ付けすることはできません。IAM におけるタグの使用の詳細については、「[AWS Identity and Access Management リソースのタグ](id_tags.md)」を参照してください。

1. ロール情報を確認し、**ロールの作成** を選択します。

### サービスにリンクされたロールの作成 (AWS CLI)
<a name="create-service-linked-role-iam-cli"></a>

IAM でサービスにリンクされたロールを作成するには、リンクされたサービスで、サービスにリンクされたロールが自動的に作成されるかどうかと、サービスの CLI からロールを作成できるかどうかについて確認します。サービス CLI がサポートされていない場合は、IAM コマンドを使用して、ロールを引き受けるためにサービスで必要な信頼ポリシーやインラインポリシーを含めて、サービスにリンクされたロールを作成することができます。

**サービスにリンクされたロールを作成するには (AWS CLI)**

次のコマンドを実行します。

```
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
```

### サービスにリンクされたロールの作成 (AWS API)
<a name="create-service-linked-role-iam-api"></a>

IAM でサービスにリンクされたロールを作成するには、リンクされたサービスで、サービスにリンクされたロールが自動的に作成されるかどうかと、サービスの API からロールを作成できるかどうかについて確認します。サービス API がサポートされていない場合は、AWS API を使用して、ロールを引き受けるためにサービスで必要な信頼ポリシーやインラインポリシーを含めて、サービスにリンクされたロールを作成することができます。

**サービスにリンクされたロールを作成するには (AWS API)**

[CreateServiceLinkedRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateServiceLinkedRole.html) API コールを使用します。リクエストで、サービス名`SERVICE_NAME_URL.amazonaws.com`を指定します。

たとえば、サービスにリンクされたロール (**[Lex Bots]**) を作成するには、`lex.amazonaws.com` を使用します。

# サードパーティー ID プロバイダーにロールを作成する
<a name="id_roles_create_for-idp"></a>

AWS アカウント で IAM ユーザーを作成する代わりに、ID プロバイダーを使用できます。ID プロバイダー (IdP) を使用すると、AWS の外部のユーザー ID を管理して、これらの外部ユーザー ID にアカウント内の AWS リソースに対するアクセス許可を付与できます。フェデレーションおよび認証プロバイダーについて詳しくは、「[ID プロバイダーと AWS とのフェデレーション](id_roles_providers.md)」を参照してください。

## OIDC と SAML のフェデレーティッドプリンシパルのロールの作成 (コンソール)
<a name="roles-creatingrole-federated-users-console"></a>

ロールを作成する手順は、選択するサードパーティープロバイダーによって異なります。
+ OpenID Connect (OIDC) については、「[OpenID Connect フェデレーション用のロールを作成する (コンソール）](id_roles_create_for-idp_oidc.md)」を参照してください。
+ SAML 2.0 については、「[SAML 2.0 フェデレーション用のロールを作成する (コンソール)](id_roles_create_for-idp_saml.md)」を参照してください。

## フェデレーションアクセス用のロールの作成 (AWS CLI)
<a name="roles-creatingrole-identityprovider-cli"></a>

サポートされている ID プロバイダー (OIDC または SAML) 用のロールを AWS CLI から作成するステップは同じです。違いは、前提条件のステップで作成する信頼ポリシーの内容です。使用するプロバイダーのタイプに合わせた**前提条件**セクションのステップに従って開始します。
+ OIDC プロバイダーについては、「[OIDC 用のロールを作成するための前提条件](id_roles_create_for-idp_oidc.md#idp_oidc_Prerequisites)」を参照してください。
+ SAML プロバイダーについては、「[SAML 用のロールを作成するための前提条件](id_roles_create_for-idp_saml.md#idp_saml_Prerequisites)」を参照してください。

AWS CLI を使用したロールの作成には、複数のステップがあります。コンソールを使用してロールを作成する場合、多くのステップは自動的に行われますが、AWS CLI を使用する場合は、各ステップを明示的に実行する必要があります。ロールを作成して、これにアクセス許可ポリシーを割り当てる必要があります。必要に応じて、ロールの[アクセス許可の境界](access_policies_boundaries.md)を設定することもできます。

**ロールを作成するには (AWS CLI)**

1. ロール [aws iam create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html) を作成します。

1. アクセス許可ポリシー [aws iam attach-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html) をロールにアタッチします。

    または

   ロールのインラインアクセス許可ポリシー[aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html) を作成します。

1. (オプション) タグ ([aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)) をアタッチして、カスタム属性をロールに追加します。

   詳細については、「[IAM ロールのタグの管理 (AWS CLI または AWS API)](id_tags_roles.md#id_tags_roles_procs-cli-api)」を参照してください。

1. (オプション) ロールの[アクセス許可の境界](access_policies_boundaries.md) [aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html) を設定します。

   アクセス許可の境界では、ロールに許可されるアクセス許可の上限を設定します。アクセス許可の境界は AWS のアドバンスド機能です。

次の例では、シンプルな環境で ID プロバイダーのロールを作成するための最初の 2 つのステップ (最も一般的なステップ) を示します。この例では、`123456789012` アカウントの任意のユーザーに、ロールを引き受けて Amazon S3 バケット `example_bucket` を表示することを許可します。また、この例では、Windows が動作しているコンピュータで AWS CLI を実行していること、さらに認証情報を使って AWS CLI を設定済みであることを前提とします。詳細については、「[Configuring the AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)」を参照してください。

次の例では、ユーザーが Amazon Cognito を使用してサインインする場合のモバイルアプリ用の信頼ポリシーを示します。この例では、*us-east:12345678-ffff-ffff-ffff-123456* は Amazon Cognito によって割り当てられた ID プール ID を表します。

------
#### [ 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"}}
    }
}
```

------

以下のアクセス許可ポリシーでは、Amazon S3 バケット `example_bucket` に対して `ListBucket` アクションのみを実行することを、ロールを引き受ける任意のユーザーに許可します。

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

****  

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

------

この `Test-Cognito-Role` ロールを作成するには、まず前の信頼ポリシーを `trustpolicyforcognitofederation.json` という名前で、前のアクセス許可ポリシーを `permspolicyforcognitofederation.json` という名前で、ローカル `policies` ドライブの `C:` フォルダに保存する必要があります。次に、以下のコマンドを使用してロールを作成し、インラインポリシーをアタッチできます。

```
# 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
```

## フェデレーションアクセス用のロールの作成 (AWS API)
<a name="roles-creatingrole-identityprovider-api"></a>

サポートされている ID プロバイダー (OIDC または SAML) 用のロールを AWS CLI から作成するステップは同じです。違いは、前提条件のステップで作成する信頼ポリシーの内容です。使用するプロバイダーのタイプに合わせた**前提条件**セクションのステップに従って開始します。
+ OIDC プロバイダーについては、「[OIDC 用のロールを作成するための前提条件](id_roles_create_for-idp_oidc.md#idp_oidc_Prerequisites)」を参照してください。
+ SAML プロバイダーについては、「[SAML 用のロールを作成するための前提条件](id_roles_create_for-idp_saml.md#idp_saml_Prerequisites)」を参照してください。

**ロールを作成する方法 (AWS API)**

1. ロールとして [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) を作成します。

1. アクセス許可ポリシーとして [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html) をロールにアタッチします。

    または

   ロールのインラインアクセス許可ポリシー [PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html) を作成します。

1. (オプション) タグ ([TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)) をアタッチして、カスタム属性をユーザーに追加します。

   詳細については、「[IAM ユーザーのタグの管理 ( AWS CLI または AWS API)](id_tags_users.md#id_tags_users_procs-cli-api)」を参照してください。

1. (オプション) ロールの[アクセス許可の境界](access_policies_boundaries.md) [PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html) を設定します。

   アクセス許可の境界では、ロールに許可されるアクセス許可の上限を設定します。アクセス許可の境界は AWS のアドバンスド機能です。

# OpenID Connect フェデレーション用のロールを作成する (コンソール）
<a name="id_roles_create_for-idp_oidc"></a>

AWS アカウントで AWS Identity and Access Management ユーザーを作成する代わりに、OpenID Connect (OIDC) フェデレーション ID プロバイダーを使用できます。ID プロバイダー (IdP) を使用すると、AWS の外部のユーザー ID を管理して、これらの外部ユーザー ID にアカウント内の AWS リソースに対するアクセス許可を付与できます。フェデレーションおよび IdPs (ID プロバイダー) について詳しくは、「[ID プロバイダーと AWS とのフェデレーション](id_roles_providers.md)」を参照してください。

## OIDC 用のロールを作成するための前提条件
<a name="idp_oidc_Prerequisites"></a>

OIDC フェデレーション用のロールを作成する前に、まず次の基本的なステップを実行する必要があります。<a name="oidc-prereqs"></a>

**OIDC フェデレーション用のロールを作成する準備をするには**

1. フェデレーション OIDC ID を提供する 1 つ以上のサービスにサインアップします。AWS リソースにアクセスする必要があるアプリを作成する場合は、プロバイダー情報も合わせてアプリを設定します。サインアップすると、プロバイダーからアプリに固有のアプリケーション ID または対象者 ID が提供されます。（プロバイダーが異なれば、このプロセスには異なる用語が使用されます。このガイドでは、プロバイダーでアプリを識別するプロセスに*設定*という用語を使用します。） プロバイダーごとに複数のアプリを設定できます。または 1 つのアプリに複数のプロバイダーを設定できます。ID プロバイダーの使用に関する情報は以下で確認してください。
   + [Login with Amazon 開発者センター](https://login.amazon.com/)
   + Facebook 開発者サイトの「[アプリまたはウェブサイトに Facebook ログインを追加する](https://developers.facebook.com/docs/facebook-login/v2.1)」
   + Google 開発者サイトの「[ログインでの OAuth 2.0 の使用 (OpenID Connect) ](https://developers.google.com/accounts/docs/OAuth2Login)」

1. <a name="idpoidcstep2"></a>IdP から必要な情報を受け取ったら、IAM で IdP を作成します。詳細については、「[IAM で OpenID Connect (OIDC) ID プロバイダーを作成する](id_roles_providers_create_oidc.md)」を参照してください。
**重要**  
Google、Facebook、または Amazon Cognito の OIDC IdP を使用している場合は、AWS マネジメントコンソール に個別の IAM IdP を作成しないでください。これらの OIDC ID プロバイダーは、すでに AWS に組み込まれており、ユーザーが使用できます。この手順をスキップして、次の手順で IdP を使用して新しいロールを作成します。

1. IdP 認証ユーザーが引き受けるロールのポリシーを準備します。すべてのロールに該当することですが、モバイルアプリ用のロールにも 2 つのポリシーがあります。1 つは、ロールの引き受け先を指定する信頼ポリシーです。もう 1 つはアクセス許可ポリシーです。このポリシーでは、モバイルアプリにアクセスを許可または拒否する AWS アクションやリソースを指定します。

   ウェブ IdP については、[Amazon Cognito](https://aws.amazon.com/cognito/) を使用して ID を管理することをお勧めします。この場合、次の例に示すような信頼ポリシーを使用します。

------
#### [ 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"}
           }
       }
   }
   ```

------

   `us-east-2:12345678-abcd-abcd-abcd-123456` は、Amazon Cognito が割り当てる ID プール ID に置き換えます。

   OIDC IdP を手動で設定する場合は、信頼ポリシーの作成時に以下の 3 つの値を使用して当該アプリにのみロールを引き受けることを許可します。
   + `Action` 要素で、`sts:AssumeRoleWithWebIdentity` アクションを使用します。
   + `Principal` 要素で、`{"Federated":providerUrl/providerArn}` 文字列を使用します。
     + 一部の一般的な OIDC IdP の場合、`providerUrl` は URL です。以下の例では、いくつかの一般的な IdP のプリンシパルを指定する方法を示します。

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

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

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

       `"Principal":{"Federated":"accounts.google.com"}`
     + 他の OIDC プロバイダーの場合は、次の例のように、[Step 2](#idpoidcstep2) で作成した OIDC IdP の Amazon リソースネーム (ARN) を使用します。

       `"Principal":{"Federated":"arn:aws:iam::123456789012:oidc-provider/server.example.com"}`
   + `Condition` 要素で、`StringEquals` 条件を使用してアクセス許可を制限します。ID プール ID (Amazon Cognito の場合) またはアプリ ID (他のプロバイダーの場合) をテストします。この ID プール ID は、IdP でアプリを設定したときに取得したアプリ ID と一致する必要があります。この ID 間の一致により、リクエストが自分のアプリからであることを確認できます。
**注記**  
Amazon Cognito アイデンティティプールの IAM ロールは、サービスプリンシパル `cognito-identity.amazonaws.com` を信頼してロールを引き受けます。このタイプのロールには、ロールを引き受けるプリンシパルを制限する条件キーが少なくとも 1 つ含まれている必要があります。  
[クロスアカウントの IAM ロール](access_policies-cross-account-resource-access.md)を引き受ける Amazon Cognito アイデンティティプールには、その他の考慮事項が適用されます。これらのロールの信頼ポリシーは、`cognito-identity.amazonaws.com` サービスプリンシパルを受け入れる必要があり、ロールの引き受けを目的のアイデンティティプールのユーザーに制限するために `aud` 条件キーを含める必要があります。この条件なしで Amazon Cognito アイデンティティプールを信頼するポリシーでは、意図しないアイデンティティプールのユーザーがロールを引き受けるリスクが生じます。詳細については、「Amazon Cognito デベロッパーガイド」の「[基本 (クラシック) 認証の IAM ロールの信頼ポリシー](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#trust-policies)」を参照してください。

     使用している IdP に応じて、以下の例に示すような、条件要素を作成します。

     `"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"}}`

     OIDC プロバイダーの場合は、次の例に示すように、OIDC IdP の完全修飾 URL と `aud` コンテキストキーを使用します。

     `"Condition": {"StringEquals": {"server.example.com:aud": "appid_from_oidc_idp"}}`
**注記**  
ロールの信頼ポリシーでプリンシパルとして指定する値は、IdP ごとに異なります。OIDC 用のロールで指定できるプリンシパルは 1 つだけです。したがって、モバイルアプリで複数の IdP からのサインインをユーザーに許可する場合は、サポートする IdP ごとに別個のロールを作成します。IdP ごとに別個の信頼ポリシーを作成します。

   ユーザーがモバイルアプリを使用して Login with Amazon からサインインする場合、次の例の信頼ポリシーが適用されます。この例では、*amzn1.application-oa2-123456* は Login with Amazon を使用するアプリを設定したときに Amazon が割り当てるアプリ ID を表します。

------
#### [ 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"}}
         }]
     }
   ```

------

   ユーザーがモバイルアプリを使用して Facebook からサインインする場合、次の例の信頼ポリシーが適用されます。この例では、*111222333444555* は Facebook が割り当てるアプリ ID を表します。

------
#### [ 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"}}
         }]
     }
   ```

------

   ユーザーがモバイルアプリを使用して Google からサインインする場合、次の例の信頼ポリシーが適用されます。この例では、*666777888999000* は Google が割り当てるアプリ ID を表します。

------
#### [ 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"}}
         }]
     }
   ```

------

   ユーザーがモバイルアプリを使用して Amazon Cognito からサインインする場合、次の例の信頼ポリシーが適用されます。この例では、*us-east:12345678-ffff-ffff-ffff-123456* は Amazon Cognito が割り当てる ID プール ID を表します。

------
#### [ 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"}}
         }]
     }
   ```

------

## OIDC 用のロールの作成
<a name="idp_oidc_Create"></a>

前提条件を満たしたら、IAM でロールを作成できます。認識された共有 OpenID Connect (OIDC) の ID プロバイダー (IdP) の場合、IAM は *ID プロバイダーコントロール*と呼ばれる JSON ウェブトークン (JWT) に特定の請求を明示的に評価する必要があります。*ID プロバイダーコントロール*を持つ OIDC IdP の詳細については、「[共有 OIDC プロバイダーの ID プロバイダーコントロール](id_roles_providers_oidc_secure-by-default.md)」を参照してください。

次の手順は、AWS マネジメントコンソール で OIDC フェデレーション用のロールを作成する方法を示します。AWS CLI または AWS API からロールを作成するには、「[サードパーティー ID プロバイダーにロールを作成する](id_roles_create_for-idp.md)」の手順を参照してください。

**重要**  
Amazon Cognito を使用する場合は、Amazon Cognito コンソールを使用してロールをセットアップします。それ以外の場合は、IAM コンソールを使用して OIDC 用のロールを作成します。

**OIDC フェデレーション用の IAM ロールを作成するには**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. ナビゲーションペインで **[ロール]** を選択した後、**[ロールの作成]** を選択します。

1. 信頼されたエンティティタイプとして **[ウェブアイデンティティ]** を選択し、**[次へ]** を選択します。

1. **[ID プロバイダー]** で、ロールの IdP を選択します。
   + 個々のウェブ IdP 用のロールを作成する場合は、**Login with Amazon**、**Facebook**、**Google** のいずれかを選択します。
**注記**  
サポートする各 IdP に対して別々のロールを作成する必要があります。
   + Amazon Cognito 用の高度なシナリオのロールを作成する場合は、**Amazon Cognito** を選択します。
**注記**  
高度なシナリオで作業する場合に限り、Amazon Cognito で使用するロールを手動で作成する必要があります。それ以外の場合は、Amazon Cognito で自動的にロールを作成できます。Amazon Cognito の詳細については、*[Amazon Cognito Developer Guide]* の [[Identity pools (federated) external identity providers]](https://docs.aws.amazon.com/cognito/latest/developerguide/external-identity-providers.html) を参照してください。
   + GitHub Actions 用のロールを作成する場合は、まず GitHub OIDC プロバイダーを IAM に追加する必要があります。GitHub OIDC プロバイダーを IAM に追加したら、**token.actions.githubusercontent.com** を選択します。
**注記**  
AWS を GitHub の OIDC プロバイダーのフェデレーティッド ID として信頼するよう設定する方法については、「[GitHub Docs - Configuring OpenID Connect in Amazon Web Services](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)」を参照してください。IAM IdP for GitHub に関連するロールへのアクセスを制限するベストプラクティスについては、このページの [GitHub OIDC ID プロバイダーのロールの設定](#idp_oidc_Create_GitHub) を参照してください。
   + HashiCorp Cloud Platform (HCP) Terraform のロールを作成するには、まず Terraform OIDC プロバイダーを IAM に追加することから始める必要があります。Terraform OIDC プロバイダーを IAM に追加したら、**[app.terraform.io]** を選択します。
**重要**  
HashiCorp Cloud Platform (HCP) Terraform OIDC プロバイダーの IAM ロールは、ロールの信頼ポリシーの IAM 条件キー `app.terraform.io:sub` を評価する必要があります。この条件キーは、ロールを引き受けることができる HCP Terraform の組織、プロジェクト、ワークスペース、または実行フェーズを制限します。この条件キーがない場合、信頼ポリシーは組織外の ID によってロールと AWS リソースに対するアクセスを付与しますが、これは最小特権の原則に整合しません。  
AWS アカウント内の HCP Terraform OIDC プロバイダーに関連付けられたロールのロール信頼ポリシーを設定または変更しても、IAM 条件キー `app.terraform.io:sub` を評価しない場合、エラーが発生します。さらに、ロール信頼ポリシーがこの条件キーを評価しない場合、AWS STS は認可リクエストを拒否します。

1. リクエストされた情報は、選択した OIDC プロバイダーによって異なります。
   + アプリケーション用の ID を入力します。ID のラベルは、選択するプロバイダーによって異なります。
     + Login with Amazon 用のロールを作成する場合は、アプリ ID を **[アプリケーション ID]** ボックスに入力します。
     + Facebook 用のロールを作成する場合は、アプリ ID を **[アプリケーション ID]** ボックスに入力します。
     + Google 用のロールを作成する場合は、対象者名を **[対象者]** ボックスに入力します。
     + Amazon Cognito 用のロールを作成する場合は、Amazon Cognito アプリケーション用に作成した アイデンティティプールの ID を、**[アイデンティティプール ID]** ボックスに入力します。
   + GitHub Actions のロールを作成する場合は、以下の情報を入力します。
     + **[対象者]** で [`sts.amazonaws.com`] を選択します。
     + **GitHub 組織**の場合、GitHub の組織名を入力します。GitHub 組織名は必須で、英数字 (ダッシュ (-) を含む) でなければなりません。GitHub 組織名に、ワイルドカード文字 (\$1 と ?) は使用できません。
     + (オプション) **[GitHub リポジトリ]** に、GitHub リポジトリの名前を入力します。値を指定しない場合は、デフォルトでワイルドカード (`*`) になります。
     + (オプション) **[GitHub ブランチ]** に、GitHub ブランチ名を入力します。値を指定しない場合は、デフォルトでワイルドカード (`*`) になります。
   + HashiCorp Cloud Platform (HCP) Terraform のロールを作成する場合は、次の詳細を入力します:
     + **[対象者]** で [`aws.workload.identity`] を選択します。
     + **[組織]** で、組織名を入力します。すべての組織にワイルドカード文字 (`*`) を指定できます。
     + **[プロジェクト]** で、プロジェクト名を入力します。すべてのプロジェクトにワイルドカード文字 (`*`) を指定できます。
     + **[ワークスペース]** で、ワークスペース名を入力します。すべてのワークスペースにワイルドカード文字 (`*`) を指定できます。
     + **[実行フェーズ]** で、実行フェーズ名を入力します。すべての実行フェーズにワイルドカード文字 (`*`) を指定できます。

1. (オプション) **[条件 (オプション)]**で、**[条件の追加]** を選択して、ロールによって付与されたアクセス許可を使用する前にアプリケーションのユーザーが満たしておく必要がある追加条件を作成します。例えば、特定の IAM ユーザー ID にのみ AWS リソースに対するアクセス許可を付与する条件を追加できます。ロールを作成した後に、信頼ポリシーに条件を追加することもできます。詳細については、「[ロール信頼ポリシーを更新する](id_roles_update-role-trust-policy.md)」を参照してください。

1. OIDC 情報を確認し、**[次へ]** を選択します。

1. IAM には、あなたのアカウント内の AWS 管理ポリシーとカスタマー管理ポリシーのリストがあります。アクセス許可ポリシーとして使用するポリシーを選択するか、**[ポリシーの作成]** を選択して新しいブラウザタブを開き、新しいポリシーをゼロから作成します。詳細については、「[IAM ポリシーの作成](access_policies_create-console.md#access_policies_create-start)」を参照してください。ポリシーを作成したら、そのタブを閉じて元のタブに戻ります。OIDC ユーザーに割り当てるアクセス許可ポリシーの横にあるチェックボックスをオンにします。必要に応じて、この時点でポリシーを選択せずに、後でポリシーをロールにアタッチすることもできます。デフォルトでは、ロールにはいずれのアクセス権限もありません。

1. (オプション) [アクセス許可の境界](access_policies_boundaries.md)を設定します。これはアドバンスド機能です。

   **[アクセス許可の境界]** セクションを開き、**[アクセス許可の境界を使用してロールのアクセス許可の上限を設定する]** を選択します。アクセス許可の境界として使用するポリシーを選択します。

1. **[次へ]** を選択します。

1. **[ロール名]** に、ロールの名前を入力します。ロール名は AWS アカウント アカウント内で一意である必要があります。大文字と小文字は区別されません。例えば、**PRODROLE** と **prodrole** というロール名を両方作成することはできません。他の AWS リソースがロールを参照している場合があるため、作成後はロールの名前を編集できません。

1. (オプション) **[説明]** には、新しいロールの説明を入力します。

1. **[ステップ 1: 信頼済みエンティティの選択]** または **[ステップ 2: 権限の追加]** のセクションで **[編集]** を選択し、ロールのユースケースと権限を変更します。

1. (オプション) ロールにメタデータを追加するには、キーバリューのペアとしてタグをアタッチします。IAM におけるタグの使用の詳細については、「[AWS Identity and Access Management リソースのタグ](id_tags.md)」を参照してください。

1. ロール情報を確認し、**ロールの作成** を選択します。

## GitHub OIDC ID プロバイダーのロールの設定
<a name="idp_oidc_Create_GitHub"></a>

GitHub を OpenID Connect (OIDC) ID プロバイダー (IdP) として使用する場合、ベストプラクティスは、IAM IdP に関連付けられたロールを引き受けることができるエンティティを制限することです。信頼ポリシーに条件ステートメントを含めると、ロールを特定の GitHub Organization、リポジトリ、またはブランチに制限できます。条件キー `token.actions.githubusercontent.com:sub` を文字列条件演算子と共に使用してアクセスを制限できます。条件を GitHub 組織内の特定のリポジトリまたはブランチのセットに制限することをお勧めします。AWS を GitHub の OIDC のフェデレーティッド ID として信頼するよう設定する方法については、「[GitHub Docs - Configuring OpenID Connect in Amazon Web Services](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)」(GitHub Docs - アマゾン ウェブ サービスの OpenID Connect 設定) を参照してください。

アクションワークフローまたは OIDC ポリシーで GitHub 環境を使用する場合は、セキュリティを強化するために保護ルールを環境に追加することを強くお勧めします。デプロイブランチとタグを使用して、環境にデプロイできるブランチとタグを制限します。保護ルールを使用して環境を設定する方法については、GitHub の記事「*Using environments for deployment*」(デプロイ用の環境の使用) に記載されている「[Deployment branches and tags](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#deployment-branches-and-tags)」(デプロイブランチとタグ) を参照してください。

GitHub の OIDC IdP がロールの信頼できるプリンシパルである場合、IAM はロールの信頼ポリシー条件をチェックして条件キー `token.actions.githubusercontent.com:sub` が存在していて、その値がワイルドカード文字 (\$1 と ?) または null だけではないことを確認します。IAM は、信頼ポリシーが作成または更新されたときにこのチェックを実行します。条件キー `token.actions.githubusercontent.com:sub` が存在しない場合、またはキー値が上記の値基準を満たさない場合、リクエストは失敗し、エラーが返されます。

**重要**  
条件キー `token.actions.githubusercontent.com:sub` を特定の組織またはリポジトリに制限しない場合、管理外の組織またはリポジトリの GitHub Actions は、AWS アカウントで GitHub IAM IdP に関連付けられたロールを引き受けることができます。

以下の信頼ポリシー例は、定義済みの GitHub Organization、リポジトリ、ブランチへのアクセスを制限します。次の例では条件キー `token.actions.githubusercontent.com:sub` の値は、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"
        }
      }
    }
  ]
}
```

------

次の例の条件は、定義された GitHub Organization とリポジトリへのアクセスを制限しますが、リポジトリ内の任意のブランチへのアクセスを許可します。

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

以下の条件例は、定義された GitHub Organization 内の任意のリポジトリまたはブランチへのアクセスを制限します。条件キー `token.actions.githubusercontent.com:sub` は、アクセスを GitHub 組織内からの GitHub Actions へのアクセスに制限する特定の値に制限することをお勧めします。

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

ポリシーの条件チェックで利用可能な OIDC フェデレーションのキーの詳細については、「[OIDC AWS フェデレーションで使用できるキー](reference_policies_iam-condition-keys.md#condition-keys-wif)」を参照してください。

# SAML 2.0 フェデレーション用のロールを作成する (コンソール)
<a name="id_roles_create_for-idp_saml"></a>

 AWS アカウント で IAM ユーザーを作成する代わりに、SAML 2.0 フェデレーションを使用できます。ID プロバイダー (IdP) を使用すると、AWS の外部のユーザー ID を管理して、これらの外部ユーザー ID にアカウント内の AWS リソースに対するアクセス許可を付与できます。フェデレーションおよび認証プロバイダーについて詳しくは、「[ID プロバイダーと AWS とのフェデレーション](id_roles_providers.md)」を参照してください。

**注記**  
フェデレーションの耐障害性を高めるには、IdP と AWS フェデレーションを、複数の SAML サインインエンドポイントをサポートするように設定することをお勧めします。詳細については、AWS セキュリティブログの記事「[フェイルオーバーにリージョン SAML エンドポイントを使用する方法](https://aws.amazon.com/blogs//security/how-to-use-regional-saml-endpoints-for-failover)」を参照してください。

## SAML 用のロールを作成するための前提条件
<a name="idp_saml_Prerequisites"></a>

SAML 2.0 フェデレーション用のロールを作成する前に、まず次の基本的なステップを実行する必要があります。<a name="saml-prereqs"></a>

**SAML 2.0 フェデレーション用のロールを作成する準備をするには**

1. <a name="idpsamlstep1"></a>SAML ベースのフェデレーション用のロールを作成する前に、IAM で SAML プロバイダーを作成する必要があります。詳細については、「[IAM で SAML ID プロバイダーを作成する](id_roles_providers_create_saml.md)」を参照してください。

1. SAML 2.0 認証ユーザーが引き受けるロールのポリシーを準備します。すべてのロールに該当することですが、SAML フェデレーション用のロールにも 2 つのポリシーが含まれています。1 つは、ロールの引き受け先を指定するロール信頼ポリシーです。もう 1 つは IAM アクセス許可ポリシーです。このポリシーでは、SAML フェデレーティッドプリンシパルにアクセスを許可または拒否する AWS アクションやリソースが指定されます。

   ロールの信頼ポリシーを作成する場合は、以下の 3 つの値を使用して当該アプリケーションにのみロールの引き受けを許可する必要があります。
   + `Action` 要素で、`sts:AssumeRoleWithSAML` アクションを使用します。
   + `Principal` 要素で、`{"Federated":ARNofIdentityProvider}` 文字列を使用します。`ARNofIdentityProvider` を、[Step 1](#idpsamlstep1) で作成した [SAML ID プロバイダー](id_roles_providers_saml.md)の ARN と置き換えます。
   + `Condition` 要素では、 `StringEquals` 条件を使用して、SAML レスポンスの `saml:aud` 属性が、コンソールにサインインするときにブラウザに表示される URL と一致することをテストします。このサインインエンドポイント URL は、ID プロバイダーの SAML 受取人属性です。特定のリージョン内にサインイン URL を含めることができます。AWS では、フェデレーションの耐障害性を向上させるために、グローバルエンドポイントの代わりにリージョンエンドポイントを使用することをお勧めします。実行可能な *region-code* 値のリストについては、「[AWS サインインエンドポイント](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)」の **[リージョン]** 列を参照します。

     サインイン URL には、SAML プロバイダーに割り当てられる一意の識別子 AWS が含まれている必要があります。IAM コンソールで ID プロバイダーを選択して詳細ページを表示することで、一意の識別子を確認できます。

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

   次の例では、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"
               }
           }
       }
   }
   ```

------

   プリンシパル ARN は、IAM で作成した SAML プロバイダー用の実際の ARN に置き換えます。これは、独自のアカウント ID およびプロバイダー名になります。

## SAML 用のロールの作成
<a name="idp_saml_Create"></a>

前提条件のステップを完了すると、SAML ベースのフェデレーション用のロールを作成できます。

**SAML ベースのフェデレーション用のロールを作成するには**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. IAM コンソールのナビゲーションペインで、**[ロール]**、**[ロールの作成]** の順に選択します。

1. **[SAML 2.0 フェデレーション]** ロールタイプを選択します。

1. **[SAML プロバイダーの選択]** で、ロールのプロバイダーを選択します。

1. SAML 2.0 のアクセスレベルメソッドを選択します。
   + **[プログラムによるアクセスのみを許可する]** を選択して、AWS API または AWS CLI からプログラムで引き受けることができるロールを作成します。
   + [**プログラムによるアクセスと AWS マネジメントコンソール によるアクセスを許可する**] を選択して、AWS マネジメントコンソール からプログラムで引き受けることのできるロールを作成します。

   作成されたロールはいずれも似ていますが、コンソールから引き受けられるロールにも、特定の条件を含む信頼ポリシーがあります。この条件により、SAML オーディエンス (`SAML:aud` 属性) が SAML プロバイダーの AWS サインインエンドポイントに設定されていることが明示的に保証されます。

1. 属性を定義する手順は、アクセスタイプによって異なります。
   + プログラムによるアクセス用のロールを作成する場合は、**[属性]** リストから属性を選択します。次に、**[値]** ボックスで、ロールに追加する値を入力します。これにより、ロールアクセスは、指定した属性を SAML 認証応答 (アサーション) に含んでいる ID プロバイダーのユーザーのみに制限されます。ロールが組織のユーザーのサブセットに限定されるように、少なくとも 1 つの属性を指定する必要があります。
   + プログラムによるアクセスと AWS マネジメントコンソール アクセスのロールを作成する場合、**[サインインエンドポイント]** セクションでは、コンソールにサインインするときにブラウザに表示される URL を定義します。このエンドポイントは、ID プロバイダーの SAML 受取人属性であり、[`saml:aud`](reference_policies_iam-condition-keys.md#condition-keys-saml) コンテキストキーにマッピングされます。詳細については、「[認証レスポンス用の SAML アサーションを設定する](id_roles_providers_create_saml_assertions.md)」を参照してください。

     1. **[リージョンエンドポイント]** または **[非リージョンエンドポイント]** を選択します。フェデレーションの耐障害性を向上させるには、複数のリージョンにまたがる SAML サインインエンドポイントを使用することをお勧めします。

     1. **リージョン**では、SAML プロバイダーが AWS サインインでサポートするリージョンを選択します。

     1.  **[一意の識別子を含めるサインイン URL]** には、サインインエンドポイントに SAML ID プロバイダーに割り当てられた一意の識別子 AWS を含めるかどうかを選択します。このオプションは、暗号化された SAML アサーションに必要です。詳細については、「[SAML 2.0 フェデレーション](id_roles_providers_saml.md)」を参照してください。

1. 信頼ポリシーに属性関連の条件をさらに追加するには、**[条件 (オプション)]** を選択し、続いて追加の条件を選択して、値を指定します。
**注記**  
最も一般的に使用される SAML 属性がリストに表示されます。IAM では、条件の作成に使用できる追加の属性をサポートしています。サポートされる属性のリストについては、「[SAML ベースのフェデレーションに利用可能なキー](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-saml)」を参照してください。リストに含まれないサポート対象の SAML 属性の条件が必要な場合、その条件は次のステップで手動で追加できます。これを行うには、ロールを作成後に信頼ポリシーを編集します。

1.  SAML 2.0 の信頼情報を確認し、**[次へ]** を選択します。

1. IAM には、あなたのアカウント内の AWS 管理ポリシーとカスタマー管理ポリシーのリストがあります。アクセス許可ポリシーとして使用するポリシーを選択するか、**[ポリシーの作成]** を選択して新しいブラウザタブを開き、新しいポリシーをゼロから作成します。詳細については、「[IAM ポリシーの作成](access_policies_create-console.md#access_policies_create-start)」を参照してください。ポリシーを作成したら、そのタブを閉じて元のタブに戻ります。SAML フェデレーションユーザーに付与するアクセス許可ポリシーの横にあるチェックボックスをオンにします。必要に応じて、この時点でポリシーを選択せずに、後でポリシーをロールにアタッチすることもできます。デフォルトでは、ロールにはいずれのアクセス権限もありません。

1. (オプション) [アクセス許可の境界](access_policies_boundaries.md)を設定します。これはアドバンスド機能です。

   **[アクセス許可の境界]** セクションを開き、**[アクセス許可の境界を使用してロールのアクセス許可の上限を設定する]** を選択します。アクセス許可の境界として使用するポリシーを選択します。

1. **[次へ]** を選択します。

1. **[次へ: レビュー]** を選択します。

1. **[ロール名]** に、ロールの名前を入力します。ロール名は AWS アカウント アカウント内で一意である必要があります。大文字と小文字は区別されません。例えば、**PRODROLE** と **prodrole** というロール名を両方作成することはできません。他の AWS リソースがロールを参照している場合があるため、作成後はロールの名前を変更できません。

1. (オプション) **[説明]** には、新しいロールの説明を入力します。

1. **[ステップ 1: 信頼済みエンティティの選択]** または **[ステップ 2: 権限の追加]** のセクションで **[編集]** を選択し、ロールのユースケースと権限を変更します。

1. (オプション) タグをキーバリューのペアとしてアタッチして、メタデータをロールに追加します。IAM におけるタグの使用の詳細については、「[AWS Identity and Access Management リソースのタグ](id_tags.md)」を参照してください。

1. ロール情報を確認し、**ロールの作成** を選択します。

ロールの作成後に、AWS に関する情報を使用して ID プロバイダーソフトウェアを設定し、SAML 信頼を確立します。この情報には、SAML フェデレーションユーザーが使用するロールが含まれます。これは、IdP と AWS との証明書利用者信頼の設定と呼ばれます。詳細については、「[証明書利用者の信頼およびクレームの追加によって SAML 2.0 IdP を設定する](id_roles_providers_create_saml_relying-party.md)」を参照してください。

# カスタム信頼ポリシーを使用してロールを作成する
<a name="id_roles_create_for-custom"></a>

カスタムの信頼ポリシーを作成して、アクセスを委任し、他のユーザーに自分の AWS アカウント でアクションの実行を許可することができます。詳細については、「[IAM ポリシーの作成](access_policies_create-console.md#access_policies_create-start)」を参照してください。

ロールを使用してアクセス権限を委任する方法の詳細については、「[ロールに関する用語と概念](id_roles.md#id_roles_terms-and-concepts)」を参照してください。

## カスタム信頼ポリシーを使用した IAM ロールの作成 (コンソール)
<a name="roles-creatingrole-custom-trust-policy-console"></a>

IAM ユーザーが引き受けるロールは、AWS マネジメントコンソール を使用して作成できます。例えば、組織で複数の AWS アカウント を使用して本稼働環境から開発環境を分離しているとします。開発用アカウントのユーザーに対して本番用アカウントのリソースへのアクセスを許可するロールを作成するための高レベルの情報については、「[個別の開発用アカウントと本稼働用アカウントを使用したシナリオ例](id_roles_common-scenarios_aws-accounts.md#id_roles_common-scenarios_aws-accounts-example)」を参照してください。

**カスタム信頼ポリシーを使用してロールを作成するには (コンソール)**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. コンソールのナビゲーションペインで、**[ロール]**、**[ロールの作成]** の順に選択します。

1. **[Custom trust policy]** (カスタム信頼ポリシー) ロールタイプを選択してください。

1. **[Custom trust policy]** (カスタム信頼ポリシー) セクションで、ロールのカスタム信頼ポリシーを入力または貼り付けます。詳細については、「[IAM ポリシーの作成](access_policies_create-console.md#access_policies_create-start)」を参照してください。

1. [ポリシーの検証](access_policies_policy-validator.md)中に生成されたセキュリティ警告、エラー、または一般的な警告を解決してから、[**Next**] (次へ) を選択します。

1. (オプション) [アクセス許可の境界](access_policies_boundaries.md)を設定します。このアドバンスド機能は、サービスロールで使用できますが、サービスにリンクされたロールではありません。

   **[Permissions boundary]** (アクセス許可の境界) セクションを開き、**[Use a permissions boundary to control the maximum role permissions]** (アクセス許可の境界を使用してロールのアクセス許可の上限を設定する) を選択します。IAM には、あなたのアカウント内の AWS 管理ポリシーとカスタマー管理ポリシーのリストがあります。アクセス許可の境界として使用するポリシーを選択します。

1. [**次へ**] を選択します。

1. [**ロール名**] の場合、ロール名のカスタマイズの度合いはサービスによって定義されます。サービスのロール名が定義されている場合、このオプションを変更することはできません。それ以外の場合、サービスでロールのプレフィックスが定義され、オプションのサフィックスを入力できる場合があります。一部のサービスでは、ロールの名前全体を指定することができます。

   可能な場合は、ロール名またはロール名のサフィックスを入力します。ロール名は AWS アカウント アカウント内で一意である必要があります。大文字と小文字は区別されません。例えば、**PRODROLE** と **prodrole** というロール名を両方作成することはできません。他の AWS リソースがロールを参照している場合があるため、作成後はロールの名前を変更できません。

1. (オプション) **[説明]** には、新しいロールの説明を入力します。

1. (オプション) **[ステップ 1: 信頼されたエンティティを選択する]** または **[ステップ 2: 許可を追加する]** セクションで **[編集]** を選択し、ロールのカスタムポリシーと許可を編集します。

1. (オプション) タグをキーバリューのペアとしてアタッチして、メタデータをロールに追加します。IAM におけるタグの使用の詳細については、「[AWS Identity and Access Management リソースのタグ](id_tags.md)」を参照してください。

1. ロール情報を確認し、**ロールの作成** を選択します。

# アクセス権を委任するポリシーの例
<a name="id_roles_create_policy-examples"></a>

以下の例では、AWS アカウント に別の AWS アカウント のリソースへのアクセスを許可する方法を示しています。これらの例の JSON ポリシードキュメントを使用して IAM ポリシーを作成する方法については、「[JSON エディターを使用したポリシーの作成](access_policies_create-console.md#access_policies_create-json-editor)」を参照してください。

**Topics**
+ [

## ロールを使用して他の AWS アカウント のリソースへのアクセス権を委任する
](#example-delegate-xaccount-rolesapi)
+ [

## ポリシーを使用してサービスへのアクセスを委任する
](#id_roles_create_policy-examples-access-to-services)
+ [

## リソースベースのポリシーを使用して他のアカウントの Amazon S3 バケットへのアクセス権を委任する
](#example-delegate-xaccount-S3)
+ [

## リソースベースのポリシーを使用して他のアカウントの Amazon SQS キューへのアクセス権を委任する
](#example-delegate-xaccount-SQS)
+ [

## アカウントがアクセスを拒否されているとアクセス権を委任できない
](#example-delegate-xaccount-SQS-denied)

## ロールを使用して他の AWS アカウント のリソースへのアクセス権を委任する
<a name="example-delegate-xaccount-rolesapi"></a>

 IAM ロールを使用し、あるアカウントに属しているユーザーに、他のアカウントに属している AWS リソースへのアクセスを許可する方法のチュートリアルについては、「[IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任](tutorial_cross-account-with-roles.md)」を参照してください。

**重要**  
特定のロールまたはユーザーの ARN を、ロールの信頼ポリシーの `Principal` 要素に含めることができます。ポリシーを保存すると、AWS は ARN を一意のプリンシパル ID に変換します。これにより、ロールまたはユーザーを削除して再作成することにより、誰かがそのユーザーの特権をエスカレートするリスクを緩和できます。通常、この ID はコンソールには表示されません。これは、信頼ポリシーが表示されるときに、ARN への逆変換が行われるためです。ただし、ロールまたはユーザーを削除すると、関係が壊れます。ポリシーは、ユーザーまたはロールを再作成しても適用されません。これは、信頼ポリシーに保存されているプリンシパル ID に一致しないためです。この場合、プリンシパル ID はコンソールに表示されます。これは、AWS が ARN に ID をマッピングできなくなるためです。その結果、信頼ポリシーの `Principal` 要素で指し示しているユーザーまたはロールを削除し、再作成する場合、ロールを編集して ARN を置き換える必要があります。ポリシーを保存するときに、ARN は新しいプリンシパル ID に変換されます。

## ポリシーを使用してサービスへのアクセスを委任する
<a name="id_roles_create_policy-examples-access-to-services"></a>

次の例では、ロールにアタッチできるポリシーを示します。ポリシーは、Amazon EMR および AWS Data Pipeline の 2 つのサービスを有効にして、ロールを想定します。これらのサービスは、ロールに割り当てられた権限ポリシー (表示されていない) によって付与されたタスクを実行できます。複数のサービスプリンシパルを指定する場合に、2 つの `Service` 要素は指定できません。1 つのみ指定できます。代わりに、1 つの `Service` 要素の値として複数のサービスのプリンシパルのアレイを使用します。

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

****  

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

------

## リソースベースのポリシーを使用して他のアカウントの Amazon S3 バケットへのアクセス権を委任する
<a name="example-delegate-xaccount-S3"></a>

この例では、アカウント A はリソースベースのポリシー (Amazon S3 [バケットポリシー](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucketPolicies.html)) を利用して、アカウント A の S3 バケットへのフルアクセスをアカウント B に許可します。次に、アカウント B が IAM ユーザーポリシーを作成して、アカウント A のバケットへのアクセス権をアカウント B のいずれかのユーザーに委任します。

アカウント A の S3 バケットポリシーは以下のポリシーのようになります。この例では、アカウント A の S3 バケットの名前を amzn-s3-demo-bucket とし、アカウント B のアカウント番号を 111122223333 とします。この番号は、アカウント B の個々のユーザーまたはグループではなく、アカウント自体のみを指定します。

------
#### [ 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/*"
    ]
  }
}
```

------

また、アカウント A は Amazon S3 [アクセスコントロールリスト (ACL)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3_ACLs_UsingACLs.html) を使用して、アカウント B に S3 バケットまたはバケット内の 1 つのオブジェクトへのアクセスを許可することもできます。この場合、唯一変更する点は、アカウント A がアカウント B にアクセス権を付与する方法です。ただし、この例の 2 番目の部分で説明したように、アカウント B はポリシーを使用して、アカウント B の IAM グループにアクセス権を委任することになります。S3 バケットとオブジェクトのアクセス制御の詳細については、[Amazon Simple Storage Service ユーザーガイド](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingAuthAccess.html)の*アクセス制御*を参照してください。

アカウント B の管理者が、次のサンプルポリシーを作成するとします。このポリシーでは、アカウント B のグループまたはユーザーに読み取りアクセスが許可されます。前のポリシーでは、アカウント B へのアクセスが許可されます。ただし、アカウント B の個々のグループとユーザーは、グループまたはユーザーポリシーでリソースへの明示的なアクセス許可が付与されるまで、リソースにアクセスできません。このポリシーのアクセス許可は、前のクロスアカウントポリシーのアクセス許可のサブセットとしてのみ付与できます。アカウント B はそのグループとユーザーに、最初のポリシーでアカウント A から付与されたものよりも多くのアクセス権限を付与することはできません。このポリシーでは、`Action` アクションのみを許可するように `List` 要素が明示的に定義されます。このポリシーの `Resource` 要素は、アカウント A が実装するバケットポリシーの `Resource` に一致します。

このポリシーを実装するには、アカウント B は IAM を使用して、アカウント 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/*"
    ]
  }
}
```

------

## リソースベースのポリシーを使用して他のアカウントの Amazon SQS キューへのアクセス権を委任する
<a name="example-delegate-xaccount-SQS"></a>

以下の例では、アカウント A には Amazon SQS キューがあり、キューにアタッチされているリソースベースのポリシーを使用して、キューへのアクセスをアカウント B に許可します。その後で、アカウント B が IAM グループポリシーを使用して、アカウント B のグループにアクセス許可を委任します。

下記の例のキューポリシーでは、アカウント B にアカウント A の *queue1* というキューで `SendMessage` および `ReceiveMessage` のアクションを実行するアクセス許可が付与されます。ただし、この許可が有効なのは、2014 年 11 月 30 日の正午から午後 3 時の間だけです。アカウント B のアカウント番号は 1111-2222-3333 です。アカウント A は、Amazon SQS を使用して、このポリシーを実装します。

------
#### [ 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"}
    }
  }
}
```

------

アカウント B のグループにアクセス権を委任するアカウント B のポリシーは、以下の例のようになります。アカウント B は、IAM を使用して、このポリシーをグループ（またはユーザー）にアタッチします。

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

****  

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

------

上記の IAM ユーザーポリシーの例では、アカウント B はワイルドカードを使用して、属しているユーザーに、アカウント A のキューに対するすべての Amazon SQS アクションへのアクセスを許可しています。ただし、アカウント B は、アカウント B にアクセス許可が付与されている範囲においてのみ、アクセスを委任できます。2 つ目のポリシーを持つアカウント B グループは、2014 年 11 月 30 日の正午から午後 3 時の間だけキューにアクセスできます。ユーザーが実行できるのは、アカウント A の Amazon SQS キューポリシーで定義されている `SendMessage` および `ReceiveMessage` アクションのみです。

## アカウントがアクセスを拒否されているとアクセス権を委任できない
<a name="example-delegate-xaccount-SQS-denied"></a>

AWS アカウント は、自リソースへのアクセスをユーザーの親アカウントに対して明示的に拒否している場合、自リソースへのアクセス権をそれらのユーザーに委任することはできません。この拒否は、アクセス権を付与する既存のポリシーをユーザーが持っているかどうかにかかわらず、そのアカウントのユーザーにも反映されます。

たとえば、アカウント A は自身の S3 バケットについて、アカウント B からのアクセスを明示的に拒否するバケットポリシーを作成するとします。ただし、アカウント B は、アカウント B のユーザーにアカウント A のバケットへのアクセス権を付与する IAM ユーザーポリシーを作成しています。アカウント A の S3 バケットに適用される明示的な拒否は、アカウント B のユーザーにも反映され、アカウント B のユーザーにアクセス権を付与する IAM ユーザーポリシーよりも優先されます (アクセス許可の評価方法については、「[ポリシーの評価論理](reference_policies_evaluation-logic.md)」を参照してください)。

アカウント A のバケットポリシーは、以下のポリシーになります。この例では、アカウント A の S3 バケットの名前を amzn-s3-demo-bucket とし、アカウント B のアカウント番号を 1111-2222-3333 とします。アカウント A は、Amazon S3 を使用して、このポリシーを実装します。

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

****  

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

------

この明示的な拒否は、アカウント A の S3 バケットにアクセスする権限を提供するアカウント B のポリシーをオーバーライドします。

# IAM ロールの管理
<a name="id_roles_manage"></a>

作成したロールをユーザー、アプリケーション、またはサービスが使用できるようにするには、該当のロールに切り替えるためのアクセス許可を付与する必要があります。グループまたはユーザーにアタッチされたポリシーを使用して、必要なアクセス許可を付与することができます。このセクションでは、ロールを使用するアクセス許可をユーザーに付与する方法について説明します。また、ユーザーが、AWS マネジメントコンソール、 Tools for Windows PowerShell、 AWS Command Line Interface (AWS CLI) 、および [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API からロールに切り替える方法についても説明します。

**重要**  
ロールの作成を IAM コンソールではなくプログラムで行う場合は、最大 64 文字までの `Path` に加えて最大 512 文字までの `RoleName` を追加できます。ただし、AWS マネジメントコンソール の [**ロールの切り替え**] 機能でロールを使用する場合は、`Path` と `RoleName` の合計が 64 文字を超えることはできません。

**Topics**
+ [

## ロールのアクセスの表示
](#roles-modify_prerequisites)
+ [

## アクセス情報に基づくポリシーの生成
](#roles-modify_gen-policy)
+ [

# ロールを切り替えるアクセス許可をユーザーに付与する
](id_roles_use_permissions-to-switch.md)
+ [

# AWS サービスにロールを渡すアクセス許可をユーザーに付与する
](id_roles_use_passrole.md)
+ [

# IAM ロールの一時的なセキュリティ認証情報を取り消す
](id_roles_use_revoke-sessions.md)
+ [

# サービスにリンクされたロールを更新する
](id_roles_update-service-linked-role.md)
+ [

# ロール信頼ポリシーを更新する
](id_roles_update-role-trust-policy.md)
+ [

# ロールに対するアクセス許可を更新する
](id_roles_update-role-permissions.md)
+ [

# ロールの設定を更新する
](id_roles_update-role-settings.md)
+ [

# ロールまたはインスタンスプロファイルを削除する
](id_roles_manage_delete.md)

## ロールのアクセスの表示
<a name="roles-modify_prerequisites"></a>

ロールのアクセス許可を変更する前に、サービスレベルの最近のアクティビティを確認する必要があります。これは、アクセス権を使用しているプリンシパル (ユーザーまたはアプリケーション) から削除しないようにするために重要です。最後にアクセスした情報を表示する方法の詳細については、「[最終アクセス情報を使用して AWS のアクセス許可を調整する](access_policies_last-accessed.md)」を参照してください。

## アクセス情報に基づくポリシーの生成
<a name="roles-modify_gen-policy"></a>

IAM エンティティ (ユーザーまたはロール) に必要な権限を超えるアクセス許可を付与することがあります。付与するアクセス権限を調整するために、エンティティのアクセスアクティビティに基づく IAM ポリシーを生成できます。IAM Access Analyzer は AWS CloudTrail ログを確認し、指定した日付範囲内のロールが使用したアクセス許可を含むポリシーテンプレートを生成します。テンプレートを使用して、きめ細かなアクセス権限で管理ポリシーを作成し、それを IAM エンティティにアタッチできます。これにより、特定のユースケースでロールが AWS リソースとインタラクションするために必要なアクセス権限のみを付与します。詳細については、「[IAM Access Analyzer ポリシーの生成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-generation.html)」を参照してください。

# ロールを切り替えるアクセス許可をユーザーに付与する
<a name="id_roles_use_permissions-to-switch"></a>

管理者が[クロスアカウントアクセス用のロールを作成する](id_roles_create_for-user.md)場合、ロールを所有するアカウント、リソース (信頼するアカウント)、およびユーザーを含むアカウント (信頼されるアカウント) の間で信頼を確立します。これを行うには、信頼するアカウントの管理者が、ロールの信頼ポリシーで信頼できるアカウント番号を `Principal` として指定します。これにより、信頼されたアカウント内のすべてのユーザーがロールを引き受けることができるようになる*可能性*があります。設定を完了するには、信頼されたアカウントの管理者がそのアカウント内の特定のグループまたはユーザーにロールを切り替えるアクセス権限を付与する必要があります。

**ロールを切り替えるアクセス許可を付与するには**

1. 信頼されたアカウントの管理者として、ユーザーの新しいポリシーを作成するか、既存のポリシーを編集して必要な要素を追加します。詳細については、「[ポリシーの作成または編集](#roles-usingrole-createpolicy)」を参照してください。

1. 次に、ロール情報を共有する方法を次の中から選択します。
   + **ロールリンク:** 詳細がすべて既に入力されている **[Switch Role]** (ロールの切り替え) ページへのリンクをユーザーに送信します。
   + **アカウント ID またはエイリアス:** ロール名とアカウント ID 番号またはアカウントのエイリアスを各ユーザーに提供します。これにより、ユーザーは [**ロールの切り替え**] ページに移動し、詳細を手動で追加できます。

   詳細については、「[ユーザーへの情報の提供](#roles-usingrole-giveuser)」を参照してください。

ロールを切り替えできるのは、IAM ユーザー、SAML フェデレーションロール、またはウェブ ID フェデレーションロールとしてサインインしている場合のみですのでご注意ください。AWS アカウントのルートユーザー としてサインインすると、ロールを切り替えることはできません。

**重要**  
AWS マネジメントコンソール で、[ExternalId](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id) 値を必要とするロールに切り替えることはできません。`ExternalId` パラメータをサポートする [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API を呼び出すことにより、このようなロールに切り替えることができます。

**注意事項**  
タスクを達成するために最終的にユーザーにアクセス許可を付与するので、このトピックでは、ユーザーのポリシーについて説明します。ただし、個々のユーザーに直接アクセス許可を付与することはお勧めしません。ユーザーがロールを引き受けると、そのロールに関連付けられたアクセス許可が割り当てられます。
AWS マネジメントコンソール でロールを切り替えると、コンソールは常に元の認可情報を使用して切り替えを認可します。これは、IAM ユーザー、SAML フェデレーションロール、またはウェブ ID フェデレーションロールとしてサインインする際に適用されます。例えば、RoleA に切り替える場合は、IAM では元のユーザーまたはフェデレーションロールの認証情報を使用して、RoleA の引き受けが許可されているかどうかが判断されます。その後、*RoleA を使用中*に RoleB への切り替えを試みると、**元の**ユーザーまたはフェデレーションロールの認証情報を使用して、RoleB への切り替えが認可されます。RoleA の資格情報は、このアクションには使用されません。

**Topics**
+ [

## ポリシーの作成または編集
](#roles-usingrole-createpolicy)
+ [

## ユーザーへの情報の提供
](#roles-usingrole-giveuser)

## ポリシーの作成または編集
<a name="roles-usingrole-createpolicy"></a>

ロールを引き受けるアクセス許可をユーザーに付与するポリシーには、次の `Allow` 効果を伴うステートメントを含める必要があります。
+ `sts:AssumeRole` アクション
+ `Resource` 要素でのロールの Amazon リソースネーム (ARN)

このポリシーを取得するユーザーは、(グループメンバーとして、または直接アタッチされて) 一覧表示されたリソース上のロールに切り替えることができます。

**注記**  
`Resource` が `*` に設定されている場合、ユーザーは、ユーザーのアカウントを信頼する任意のアカウントで任意のロールを引き受けることができます。（つまり、ロールの信頼ポリシーは、ユーザーのアカウントを `Principal` として指定します）。ベストプラクティスとして、[最小権限の原則](http://en.wikipedia.org/wiki/Principle_of_least_privilege)に従って、ユーザーが必要とするロールに限って完全な ARN を指定することをお勧めします。

次の例に示すポリシーでは、ユーザーは 1 つのアカウントに限ってロールを引き受けることができます。さらに、このポリシーではワイルドカード (\$1) を使用し、ロール名が文字列 `Test` で始まる場合に限り、ユーザーがロールに切り替えることができることを指定します。

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

****  

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

------

**注記**  
ロールをユーザーに付与するアクセス権限は、既にユーザーに付与されているアクセス権限に追加されるわけではありません。ユーザーがロールに切り替えると、そのユーザーはロールによって付与されたアクセス権限と引き換えに元々付与されていたアクセス権限を一時的に喪失します。ユーザーがロールを終了すると、元のユーザーアクセス権限が自動的に復元します。例えば、ユーザーのアクセス許可では Amazon EC2 インスタンスの操作が許可されるが、これらのアクセス許可はロールのアクセス許可ポリシーで付与されないとします。この場合、ロールの使用中に、ユーザーはコンソールで Amazon EC2 インスタンスを操作できません。さらに、`AssumeRole` を介して取得された一時的な認証情報は、プログラムでは Amazon EC2 インスタンスで機能しません。

## ユーザーへの情報の提供
<a name="roles-usingrole-giveuser"></a>

ロールを作成し、このロールに切り替えるアクセス許可をユーザーに付与した後で、ユーザーに以下を提供する必要があります。
+ ロールの名前は
+ ID またはロールが含まれているアカウントエイリアス

アカウント ID とロール名が事前設定されたリンクを送信すると、ユーザーのアクセスが簡素化されます。ロールのリンクは、**[ロールの作成]** ウィザードの完了後に **[ロールを表示]** バナーを選択すると表示されます。また、クロスアカウントが有効なロールの場合は **[ロールの概要]** ページに表示されます。

または、次の形式を使用して手動でリンクを作成することもできます。次の例の 2 つのパラメータのアカウント ID またはエイリアスとロール名を置き換えます。

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

ユーザーにトピック「[ユーザーから IAM ロールに切り替える (コンソール)](id_roles_use_switch-role-console.md)」を参照してプロセスに従って進めてもらうことをお勧めします。ロールを引き受ける際に遭遇する可能性がある一般的な問題のトラブルシューティングを行うには、、「[ロールを引き受けることができない](troubleshoot_roles.md#troubleshoot_roles_cant-assume-role)」を参照してください。

**考慮事項**
+ プログラムでロールを作成する場合は、パスと名前を持ったロールを作成できます。、ユーザーが AWS マネジメントコンソール の[**ロールの切り替え**]ページで入力できるように、完全なパスとロール名をユーザーに提供する必要があります。例: `division_abc/subdivision_efg/role_XYZ`。
+ プログラムでロールを作成する場合は、512 文字までの `Path` と `RoleName` を追加できます。名前の長さは最大 64 文字です。ただし、AWS マネジメントコンソール の [**ロールの切り替え**] 機能でロールを使用するには、`Path` と `RoleName` の合計が 64 文字を超えることはできません。
+ セキュリティ上の理由から、[AWS CloudTrail ログを確認](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)して、AWS でアクションを実行したユーザーを調べることができます。ロール信頼ポリシーで `sts:SourceIdentity` 条件キーを使用すると、ユーザーがロールを引き受けるときに ID を指定するように要求できます。例えば、IAM ユーザーがセッション名として自分のユーザー名を指定するように要求できます。これにより、AWS の特定のアクションを実行したユーザーを特定できます。詳細については、「[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)」を参照してください。[`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname) 条件キーを使用すると、ユーザーがロールを引き受けるときにセッション名を指定するように要求できます。これは、ロールが異なるプリンシパルによって使用される場合に、ロールセッションを区別するのに役立ちます。

# AWS サービスにロールを渡すアクセス許可をユーザーに付与する
<a name="id_roles_use_passrole"></a>

多くの AWS サービスを設定するには、そのサービスに IAM ロールを*渡す*必要があります。これで、その後サービスがロールを引き受け、ユーザーに代わってアクションを実行できるようになります。大半のサービスでは、サービスにロールを渡さなければならないのはセットアップ時の 1 回のみで、サービスがロールを引き受けるたびには行いません。例えば、Amazon EC2 インスタンスで実行しているアプリケーションがあるとします。このアプリケーションには認証に使う一時的な認証情報と、AWSでアクションを実行するためのアプリケーション認可のアクセス許可が必要です。アプリケーションをセットアップする場合、こうした認証情報を提供するインスタンスで使用するよう、Amazon EC2 にロールを渡す必要があります。そのロールに IAM ポリシーをアタッチして、インスタンスで実行するアプリケーションのアクセス許可を定義します。アプリケーションは、このロールが許可しているアクションを実行する必要があるたびに、ロールを引き受けます。

ユーザーがロール (とそのアクセス許可) を AWS サービスに渡すには、そのサービスに*ロールを渡す*アクセス許可が必要になります。これにより、承認済みのユーザーのみが、アクセス許可を付与するロールを使用してサービスを設定できるようになります。ユーザーが AWS サービスにロールを渡すには、IAM ユーザー、ロール、またはグループに `PassRole` アクセス許可を付与する必要があります。

**警告**  
同じ AWS アカウントを共有するサービスに IAM ロールを渡すには、`PassRole` のアクセス許可のみ使用できます。アカウント A のロールをアカウント B のサービスに渡すには、まずアカウント A からロールを引き受けることができる IAM ロールをアカウント B に作成する必要があります。その後、アカウント B のロールをサービスに渡すことができます。詳細については、「[IAM でのクロスアカウントのリソースへのアクセス](access_policies-cross-account-resource-access.md)」を参照してください。
ロールをタグ付けした後に、`iam:PassRole` アクションでポリシー内の `ResourceTag` 条件キーを使用してロールを渡せるユーザーを制御しないようにしてください。このアプローチでは信頼できる結果は得られません。

`PassRole` アクセス許可を設定する場合、ユーザーがロールに必要以上のアクセス許可があるロールを渡さないようにする必要があります。例えば、Alice が Amazon S3 アクションを実行する許可を持っていない場合があります。Alice が Amazon S3 アクションを許可するサービスにロールを渡すことができる場合、サービスはジョブの実行時に、Alice に代わって Amazon S3 アクションを実行できます。

サービスにリンクされたロールを特定する場合は、サービスにそのロールを渡すためのアクセス許可も必要になります。一部のサービスでは、そのサービスでアクションを実行する際にアカウント内にサービスにリンクされたロールが自動的に作成されます。例えば、Amazon EC2 Auto Scaling では Auto Scaling グループが最初に作成されたときに、`AWSServiceRoleForAutoScaling` のサービスにリンクされたロールを作成します。のアクセス許可がない状態で Auto Scaling グループの作成時にサービスにリンクされたのアクセス許可がない状態で、のアクセス許可がない状態で、`iam:PassRole` のアクセス許可がない状態で、エラーが表示されます。ロールを明示的に指定しない場合、`iam:PassRole` のアクセス許可は不要で、デフォルトではそのグループで実行されるすべての操作に `AWSServiceRoleForAutoScaling` ロールを使用します。サービスにリンクされたロールをサポートするサービスを確認するには、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照してください。サービスにリンクされたロールがサービスでアクションの実行時に自動的に作成されるかどうかを確認するには、「**はい**」リンクを選択して、該当サービスのサービスにリンクされたロールに関するドキュメントを参照してください。

ユーザーは、ロールを使用してサービスにアクセス許可を割り当てる任意の API オペレーションで、パラメータとして ARN を渡すことができます。次に、そのサービスはユーザーに `iam:PassRole` 権限があるかどうか確認します。ユーザーが渡せるロールを承認済みのロールだけに制限するには `iam:PassRole` のアクセス許可と IAM のポリシーステートメントの `Resources` 要素をフィルターに掛けることができます。

JSON ポリシーの `Condition` 要素を使用して、すべての AWS リクエストのリクエストコンテキストに含まれるキーの値をテストできます。ポリシーでの条件キーの使用の詳細については、「[IAM JSON ポリシー要素Condition](reference_policies_elements_condition.md)」をご参照ください。`iam:PassedToService` 条件キーを使用して、ロールを渡すことができるサービスのサービスプリンシパルを指定できます。ポリシーでの `iam:PassedToService` 条件キーの使用の詳細については、「[iam:PassedToService](reference_policies_iam-condition-keys.md#ck_PassedToService)」をご参照ください。

**例 1**  
インスタンスの起動時に、承認済みの一連のロールを Amazon EC2 サービスに渡すための権限をユーザーに付与したいと考えているとします。その場合、3 つの要素が必要です。
+ ロールに許可されている内容を定義し、ロールにアタッチしている IAM の*アクセス許可ポリシー* ロールが実行しなければならない操作やロールが操作を実行する上で必要とするリソースのみにアクセス許可を制限します。AWS のマネージドまたはカスタマー定義の IAM アクセス権ポリシーが使用できます。

------
#### [ 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" ]
      }
  }
  ```

------
+ サービスにロールの引き受けを許可する、ロールの*信頼ポリシー*。例えば、次の信頼ポリシーを `UpdateAssumeRolePolicy` アクションを使用するロールにアタッチできます。この信頼ポリシーは Amazon EC2 がロールを使用し、そのロールにアタッチしているアクセス許可の使用を許可します。

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

****  

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

------
+ 承認済みのロールのみをユーザーが渡せるように許可する、IAM ユーザーにアタッチしている IAM の*アクセス許可ポリシー*。ユーザーが渡すロールの詳細を得るため、通常 `iam:GetRole` を `iam:PassRole` に追加します。この例でユーザーが渡すことができるのは、指定されたアカウントに存在し、`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-*"
          }
      ]
  }
  ```

------

これでユーザーは割り当てられたロールで Amazon EC2 インスタンスを起動することができます。インスタンスで実行しているアプリケーションはインスタンスプロファイルのメタデータのロールで一時的な認証情報にアクセスすることができます。ロールにアタッチされたアクセス権限ポリシーは、インスタンスに許可する操作を定義します。

**例 2**  
Amazon Relational Database Service (Amazon RDS) は、**拡張モニタリング**と呼ばれる機能をサポートしています。この機能により、Amazon RDS はエージェントを使用してデータベースインスタンスをモニタリングできます。また、Amazon RDS は Amazon CloudWatch Logs にメトリックスを記録することもできます。この機能を有効にするには、サービスロールを作成して、メトリクスをモニタリングしログに書き込む権限を Amazon RDS に付与する必要があります。

**Amazon RDS 拡張モニタリング用のロールを作成するには**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. [**ロール**]、[**ロールの作成**] の順に選択します。

1. **[AWS Service]** ロールタイプを選択し、**[Use cases for other AWS のサービス]** で **[RDS]** サービスを選択します。**[RDS – Enhanced Monitoring]** (RDS – 拡張モニタリング)、**[Next]** (次へ) の順に選択します。

1. **AmazonRDSEnhancedMonitoringRole** アクセス権ポリシーを選択します。

1. [**次へ**] を選択します。

1. **[Role name]** (ロール名) に、このロールの目的を識別しやすくするロール名を入力します。ロール名は AWS アカウント アカウント内で一意である必要があります。ロール名がポリシーまたは ARN の一部として使用される場合、ロール名は大文字と小文字が区別されます。サインイン処理中など、コンソールでロール名がユーザーに表示される場合、ロール名は大文字と小文字を区別しません。さまざまなエンティティがロールを参照する可能性があるため、作成後にロール名を編集することはできません。

1. (オプション) **[説明]** には、新しいロールの説明を入力します。

1. (オプション) タグをキーバリューペアとしてアタッチして、メタデータをユーザーに追加します。IAM におけるタグの使用の詳細については、「[AWS Identity and Access Management リソースのタグ](id_tags.md)」を参照してください。

1. ロール情報を確認し、**ロールの作成** を選択します。

ロールを引き受ける `monitoring.rds.amazonaws.com` サービスのアクセス許可を付与する信頼ポリシーをロールが自動的に取得します。その後、Amazon RDS は `AmazonRDSEnhancedMonitoringRole` ポリシーが許可するすべての操作を実行できるようになります。

拡張モニタリングへのアクセスを許可するユーザーは、次に示すように、ユーアーが RDS をリストすることを許可するステートメントとユーザーがロールを渡すことを許可するステートメントを含むポリシーが必要になります。アカウント番号を自分のものに置き換え、ロールの名前をステップ 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"
    }
```

別のポリシーのステートメントとこのステートメントを組み合わせたり、独自のポリシーで使用することができます。代わりにユーザーが `RDS-` で始まるロールを渡せるように指定するには、以下のようにリソース ARN にあるロールの名前をワイルドカードに置き換えできます。

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

## AWS CloudTrail ログ内の `iam:PassRole` アクション
<a name="id_roles_use_passrole_logs"></a>

 `PassRole` は API 呼び出しではありません。`PassRole` はアクセス許可です。つまり、IAM `PassRole` には CloudTrail ログは生成されません。CloudTrail でどのロールがどの AWS のサービス に渡されるかを確認するには、ロールを受け取る AWS のリソースを作成または変更した CloudTrail ログを確認する必要があります。例えば、ロールが作成されると AWS Lambda 関数に渡されます。`CreateFunction` アクションのログには、関数に渡されたロールの記録が表示されます。

# IAM ロールの一時的なセキュリティ認証情報を取り消す
<a name="id_roles_use_revoke-sessions"></a>

**警告**  
このページの手順に従うと、ロールを引き受けることによって作成された現在のセッションのすべてのユーザーは、すべての AWS アクションとリソースへのアクセスを拒否されます。その結果、保存されていない作業は失われます。

ユーザーが長いセッションの有効期間 (12 時間など) を使用して AWS マネジメントコンソール にアクセスできるようにすると、一時的な認証情報がすぐに期限切れになることはありません。ユーザーが意図せずに認証情報を不正なサードパーティーに公開した場合、そのパーティーはセッションの期間アクセスできます。ただし、必要がある場合は、特定の時点より前に発行したロールの認証情報の、すべてのアクセス許可をすぐに取り消しできます。指定された時間より前に発行された、そのロールのすべての一時的な認証情報が無効になります。これにより、すべてのユーザーは新しい認証情報を再認証し、リクエストしなければならなくなります。

 

**注記**  
*[サービスにリンクされたロール](id_roles.md#iam-term-service-linked-role)*のセッションを取り消すことはできません。

このトピックの手順を使用してロールのアクセス許可を取り消す場合、AWS は、すべてのアクションへのすべてのアクセス許可を拒否するロールに新しいインラインポリシーをアタッチします。このポリシーに含まれる条件によって制限が適用されるのは、アクセス許可が取り消される*前*にユーザーがロールを引き受けた場合のみです。アクセス許可が取り消された*後*にユーザーがロールを引き受けた場合、拒否ポリシーはそのユーザーに適用されません。

アクセスの拒否ついての詳細は、「[一時的なセキュリティ認証情報のアクセス権限を無効にする](id_credentials_temp_control-access_disable-perms.md)」を参照してください。

**重要**  
この拒否ポリシーは、期間が長いコンソールセッションを使用するユーザーにだけでなく、指定されたロールのすべてのユーザーに適用されます。

## ロールからセッションアクセス許可を取り消すための最小限のアクセス許可
<a name="revoke-session-permissions"></a>

ロールから正常にセッションアクセス許可を取り消すには、ロールの `PutRolePolicy` アクセス許可が必要です。これにより、`AWSRevokeOlderSessions` インラインポリシーをロールにアタッチできます。

## セッションアクセス許可のキャンセル
<a name="revoke-session"></a>

ロールからセッションのアクセス許可を取り消すと、ロールを引き受けたすべてのユーザーに対するすべてのアクセス許可を拒否できます。

**注記**  
IAM アイデンティティセンターのアクセス許可セットから作成された IAM のロールを編集することはできません。IAM アイデンティティセンターでユーザーのアクティブなアクセス許可セットセッションを取り消す必要があります。詳細については、「IAM Identity Center ユーザーガイド」の「[Revoke active IAM role sessions created by permission sets](https://docs.aws.amazon.com/singlesignon/latest/userguide/useraccess.html#revoke-user-permissions)」を参照してください。

**ロール認証情報のすべての現在のユーザーの、すべてのアクセス許可をすぐに拒否するには**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. ナビゲーションペインで、**[ロール]** に続いて、アクセス許可を取り消すロールの名前 (チェックボックスではありません) を選択します。

1. 選択したロールの **[概要]** ページで、**[セッションの無効化]** タブを選択します。

1. **[セッションの無効化]** タブで、**[アクティブなセッションの無効化]** を選択します。

1. AWS によってアクションを確認するよう求められます。**[このロールのアクティブなセッションをすべて無効にすることに同意します]** のチェックボックスをオンにして、ダイアログボックスの **[アクティブなセッションの無効化]** を選択します。

   その後、IAM がロールに `AWSRevokeOlderSessions` という名前のポリシーをアタッチします。**[アクティブなセッションの無効化]** を選択すると、ポリシーは、過去にロールを引き受けたユーザーに加えて、約 30 秒後にロールを引き受けるユーザーに対するすべてのアクセスを拒否します。この将来の時間の選択では、更新されたポリシーが特定のリージョンで有効になる前に取得または更新された新しいセッションに対処するために、ポリシーの伝播遅延が考慮されます。[アクティブなセッションの無効化] を選択した後、約 30 秒が経過した後にロールを引き受けるユーザーは影響を受けません。変更がすぐに表示されるとは限らない理由については、「[行った変更がすぐに表示されないことがある](troubleshoot.md#troubleshoot_general_eventual-consistency)」をご参照ください。

**注記**  
後で再度 **[アクティブなセッションの無効化]** を選択すると、ポリシーのタイムスタンプが更新され、新しく指定された時間の前にロールを引き受けたユーザーのすべてのアクセス許可が再度拒否されます。

この方法でセッションが取り消された有効なユーザーは、作業を続行するには新しいセッション用の一時的な認証情報を取得する必要があります。この AWS CLI は、期限切れになるまで認証情報をキャッシュします。有効でなくなった、キャッシュされている認証情報の削除と更新を CLI に強制するには、次のいずれかのコマンドを実行します。

**Linux、macOS、または Unix**

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

**Windows**

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

## 指定した時間よりも前にセッションのアクセス許可を取り消す
<a name="revoke-session-policy"></a>

 また、AWS CLI または SDK を使用して、任意のタイミングでセッション許可を無効化することで、ポリシーの条件の要素で `aws:TokenIssueTime` キーの値を指定することもできます。

このポリシーは、`aws:TokenIssueTime` の値が指定した日時より前である場合、すべてのアクセス許可を拒否します。`aws:TokenIssueTime` の値は、一時的なセキュリティ認証情報が作成された正確な時間に相当します。`aws:TokenIssueTime` の値は、一時的なセキュリティ認証情報を使用して署名された AWS リクエストのコンテキストでのみ存在します。そのため、ポリシーの Deny ステートメントは、IAM ユーザーの長期の認証情報を使用して署名されたリクエストには影響しません。

このポリシーは、ロールにアタッチすることもできます。その場合、このポリシーは、指定した日時より前に、そのロールによって作成された一時的なセキュリティ認証情報のみに影響します。

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

****  

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

------

この方法でセッションが取り消された有効なユーザーは、作業を続行するには新しいセッション用の一時的な認証情報を取得する必要があります。この AWS CLI は、期限切れになるまで認証情報をキャッシュします。有効でなくなった、キャッシュされている認証情報の削除と更新を CLI に強制するには、次のいずれかのコマンドを実行します。

**Linux、macOS、または Unix**

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

**Windows**

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

# サービスにリンクされたロールを更新する
<a name="id_roles_update-service-linked-role"></a>

サービスにリンクされたロールを編集するメソッドは、サービスによって異なります。一部のサービスでは、サービスコンソール、API、CLI からサービスにリンクされたロールのアクセス権限を編集することができます。ただし、サービスにリンクされたロールを作成すると多くのエンティティによりロールが参照されるため、ロール名を変更することはできません。ロールの説明は、IAM コンソール、API、CLI から編集することができます。

サービスにリンクされたロールを使用してサポートするサービスについては、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照し、**[Service-Linked Role]** (サービスにリンクされたロール) 列が **[Yes]** (はい) になっているサービスを検索してください。サービスにリンクされたロールをサービスで編集できるかどうかを確認するには、「**はい**」リンクを選択して、該当サービスのサービスにリンクされたロールに関するドキュメントを参照してください。

## サービスにリンクされたロールの説明の編集 (コンソール)
<a name="edit-service-linked-role-iam-console"></a>

サービスにリンクされたロールの説明は、IAM コンソールを使用して編集できます。

**サービスにリンクされたロールの説明を編集するには (コンソール)**

1. IAM コンソールのナビゲーションペインで [**ロール**] を選択します。

1. 変更するロールの名前を選択します。

1. **ロールの説明**の右端にある**編集**を選択します。

1. ボックスに新しい説明を入力し、**保存**を選択します。

## サービスにリンクされたロールの説明の編集 (AWS CLI)
<a name="edit-service-linked-role-iam-cli"></a>

AWS CLI から IAM コマンドを使用して、サービスにリンクされたロールの説明を編集できます。

**サービスにリンクされたロールの説明を変更するには (AWS CLI)**

1. (オプション) ロールの現在の説明を表示するには、以下のコマンドを実行します。

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

   CLI コマンドでは、ARN ではなくロール名を使用してロールを参照します。例えば、ロールの ARN が `arn:aws:iam::123456789012:role/myrole` である場合、そのロールを **myrole** と参照します。

1. サービスにリンクされたロールの説明を更新するには、次のコマンドを実行します。

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

## サービスにリンクされたロールの説明の編集 (AWS API)
<a name="edit-service-linked-role-iam-api"></a>

サービスにリンクされたロールの説明は、AWS API を使用して編集できます。

**サービスにリンクされたロールの説明を変更するには (AWS API)**

1. (オプション) ロールの現在の説明を表示するには、次のオペレーションを呼び出し、ロールの名前を指定します。

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

1. ロールの説明を更新するには、次のオペレーションを呼び出し、ロールの名前 (およびオプションの説明) を指定します。

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

# ロール信頼ポリシーを更新する
<a name="id_roles_update-role-trust-policy"></a>

ロールを引き受けるユーザーを変更するには、ロールの信頼ポリシーを変更する必要があります。*[サービスにリンクされたロール](id_roles.md#iam-term-service-linked-role)*の信頼ポリシーは変更できません。

**注意事項**  
ユーザーがプリンシパルとしてロールの信頼ポリシーに表示されているが、そのロールを引き受けることができない場合は、ユーザーの[アクセス許可の境界](access_policies_boundaries.md)を確認します。アクセス許可の境界がユーザーに対して設定されている場合は、`sts:AssumeRole` アクションを許可する必要があります。
ロールセッション内でユーザーが現在のロールを再び引き受けることができるようにするには、ロール信頼ポリシーでロール ARN または AWS アカウント ARN をプリンシパルとして指定します。Amazon EC2、Amazon ECS、Amazon EKS、Lambda などのコンピューティングリソースを提供する AWS のサービス は、一時的な認証情報を提供し、これらの認証情報を自動的に更新します。これにより、常に有効な認証情報セットを確保できます。これらのサービスでは、一時的な認証情報を取得するために現在のロールを再度引き受ける必要はありません。ただし、[セッションタグ](id_session-tags.md)または[セッションポリシー](access_policies.md#policies_session)を渡す場合は、現在のロールを再度引き受ける必要があります。


## ロール信頼ポリシーの更新 (コンソール)
<a name="id_roles_update-trust-policy-console"></a>

**AWS マネジメントコンソールでロールの信頼ポリシーを変更するには**

1. AWS マネジメントコンソール にサインインして、IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. IAM コンソールのナビゲーションペインで **[ロール]** を選択します。

1. アカウントのロールの一覧で、変更するロールの名前を選択します。

1. **[信頼関係]** タブを選択し、続いて **[信頼ポリシーの編集]** を選択します。

1. 必要に応じて信頼ポリシーを編集します。ロールを引き受ける他のプリンシパルを追加するには、`Principal` 要素で指定します。以下のポリシースニペットの例では、`Principal` 要素の 2 つの AWS アカウント を参照する方法を示しています。

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

   別のアカウントでプリンシパルを指定した場合、ロールの信頼ポリシーにアカウントを追加しても、クロスアカウントの信頼関係は半分しか確立されません。デフォルトでは、信頼されたアカウントのユーザーはロールを引き受けることができません。新しく信頼されたアカウントの管理者は、ロールを引き受けるアクセス許可をユーザーに付与する必要があります。これを行うには、ユーザーにアタッチするポリシーを作成または編集し、`sts:AssumeRole` アクションへのアクセスをユーザーに許可する必要があります。詳細については、次の手順または「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。

   以下のポリシースニペットでは、AWS 要素で `Principal` の 2 つのサービスを参照する方法を示します。

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

1. 信頼ポリシーの編集を完了したら、**[Update policy]** (ポリシーの更新) を選択して変更を保存します。

   ポリシーの構造や構文の詳細については、「[AWS Identity and Access Management でのポリシーとアクセス許可](access_policies.md)」および「[IAM JSON ポリシー要素のリファレンス](reference_policies_elements.md)」を参照してください。

**信頼された外部アカウントのユーザーにロールの使用を許可するには (コンソール)**

この手順の詳細については、「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。

1. 信頼された外部 AWS アカウント にサインインします。

1. ユーザーとグループのどちらにアクセス許可をアタッチするかを決定します。IAM コンソールのナビゲーションペインで **[Users]** (ユーザー) または **[User groups]** (ユーザーグループ) を適切に選択します。

1. アクセスを許可する対象となるユーザーまたはグループの名前を選択し、[**Permissions (アクセス許可)**] タブを選択します。

1. 次のいずれかを行います。
   + 既存のカスタマー管理ポリシーを編集するには、ポリシーの名前を選択してから [**ポリシーの編集**] を選択し、[**JSON**] タブを選択します。AWS の管理ポリシーを編集することはできません。AWS 管理ポリシーには AWS アイコン (![\[Orange cube icon indicating a policy is managed by AWS.\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/policy_icon.png)) が表示されます。AWS 管理ポリシーとカスタマー管理ポリシーの違いの詳細については、「[管理ポリシーとインラインポリシー](access_policies_managed-vs-inline.md)」を参照してください。
   + インラインポリシーを編集するには、ポリシーの名前の横にある矢印を選択してから、[**ポリシーの編集**] を選択します。

1. ポリシーエディターで、新しい `Statement` 要素を追加して、次のように指定します。

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

   ステートメント内の ARN を、ユーザーが引き受けるロールの ARN に置き換えます。

1. 画面のプロンプトに従って、ポリシーの編集を終了します。

## ロール信頼ポリシーの更新 (AWS CLI)
<a name="id_roles-update-trust-policy-cli"></a>

AWS CLI を使用して、誰がロールを引き受けることができるかを変更できます。

**ロールの信頼ポリシーを変更するには (AWS CLI)**

1. (オプション) 変更するロールの名前が不明である場合は、次のコマンドを実行してアカウントのロールを一覧表示します。
   + [aws iam list-roles](https://docs.aws.amazon.com/cli/latest/reference/iam/list-roles.html)

1. (オプション) ロールの現在の信頼ポリシーを表示するには、次のコマンドを実行します。
   + [aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. ロールにアクセス可能な信頼されたプリンシパルを変更するには、更新された信頼ポリシーを使用してテキストファイルを作成します。ポリシーの作成には任意のテキストエディタを使用できます。

   以下の信頼ポリシーの例では、`Principal` 要素で 2 つの AWS アカウント を参照する方法を示します。これにより、2 つの別個の AWS アカウント 内のユーザーが、このロールを引き受けることができます。

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

****  

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

------

   別のアカウントでプリンシパルを指定した場合、ロールの信頼ポリシーにアカウントを追加しても、クロスアカウントの信頼関係は半分しか確立されません。デフォルトでは、信頼されたアカウントのユーザーはロールを引き受けることができません。新しく信頼されたアカウントの管理者は、ロールを引き受けるアクセス許可をユーザーに付与する必要があります。これを行うには、ユーザーにアタッチするポリシーを作成または編集し、`sts:AssumeRole` アクションへのアクセスをユーザーに許可する必要があります。詳細については、次の手順または「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。

1. 先ほど作成したファイルを使用して信頼ポリシーを更新するには、次のコマンドを実行します。
   + [aws iam update-assume-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/update-assume-role-policy.html)

**信頼された外部アカウントのユーザーにロールの使用を許可するには (AWS CLI)**

この手順の詳細については、「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。

1. JSON ファイルを作成し、ロールを引き受けるためのアクセス許可を付与するアクセス許可ポリシーを含めます。たとえば、次のポリシーには必要最小限のアクセス権限が含まれています。

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

****  

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

------

   ステートメント内の ARN を、ユーザーが引き受けるロールの ARN に置き換えます。

1. 次のコマンドを実行し、信頼ポリシーが含まれている JSON ファイルを IAM にアップロードします。
   + [aws iam create-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/create-policy.html)

   このコマンドの出力には、ポリシーの ARN が含まれています。この ARN を書き留めます。後のステップで必要になります。

1. ポリシーをアタッチするユーザーまたはグループを決定します。目的のユーザーやグループの名前が不明である場合は、以下のいずれかのコマンドを使用して、アカウントのユーザーやグループを一覧表示します。
   + [aws iam list-users](https://docs.aws.amazon.com/cli/latest/reference/iam/list-users.html)
   + [aws iam list-groups](https://docs.aws.amazon.com/cli/latest/reference/iam/list-groups.html)

1. 以下のいずれかのコマンドを使用して、前のステップで作成したポリシーをユーザーまたはグループにアタッチします。
   + [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)

## ロール信頼ポリシーの更新 (AWS API)
<a name="id_roles-update-trust-policy-api"></a>

AWS API を使用して、誰がロールを引き受けることができるかを変更できます。

**ロールの信頼ポリシーを変更するには (AWS API)**

1. (オプション) 変更するロールの名前が不明な場合は、次のオペレーションを呼び出してアカウントのロールを一覧表示します。
   + [ListRoles](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html)

1. (オプション) ロールの現在の信頼ポリシーを表示するには、次のオペレーションを呼び出します。
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html)

1. ロールにアクセス可能な信頼されたプリンシパルを変更するには、更新された信頼ポリシーを使用してテキストファイルを作成します。ポリシーの作成には任意のテキストエディタを使用できます。

   以下の信頼ポリシーの例では、`Principal` 要素で 2 つの AWS アカウント を参照する方法を示します。これにより、2 つの別個の AWS アカウント 内のユーザーが、このロールを引き受けることができます。

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

****  

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

------

   別のアカウントでプリンシパルを指定した場合、ロールの信頼ポリシーにアカウントを追加しても、クロスアカウントの信頼関係は半分しか確立されません。デフォルトでは、信頼されたアカウントのユーザーはロールを引き受けることができません。新しく信頼されたアカウントの管理者は、ロールを引き受けるアクセス許可をユーザーに付与する必要があります。これを行うには、ユーザーにアタッチするポリシーを作成または編集し、`sts:AssumeRole` アクションへのアクセスをユーザーに許可する必要があります。詳細については、次の手順または「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。

1. 先ほど作成したファイルを使用して信頼ポリシーを更新するには、次のオペレーションを呼び出します。
   + [UpdateAssumeRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAssumeRolePolicy.html)

**信頼された外部アカウントのユーザーにロールの使用を許可するには (AWS API)**

この手順の詳細については、「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。

1. JSON ファイルを作成し、ロールを引き受けるためのアクセス許可を付与するアクセス許可ポリシーを含めます。たとえば、次のポリシーには必要最小限のアクセス権限が含まれています。

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

****  

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

------

   ステートメント内の ARN を、ユーザーが引き受けるロールの ARN に置き換えます。

1. 次のオペレーションを呼び出し、信頼ポリシーが含まれている JSON ファイルを IAM にアップロードします。
   + [CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html)

   このオペレーションの出力には、ポリシーの ARN が含まれています。この ARN を書き留めます。後のステップで必要になります。

1. ポリシーをアタッチするユーザーまたはグループを決定します。目的のユーザーやグループの名前が不明である場合は、以下のいずれかのオペレーションを呼び出して、アカウントのユーザーやグループを一覧表示します。
   + [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. 以下のいずれかのオペレーションを呼び出して、前のステップで作成したポリシーをユーザーまたはグループにアタッチします。
   +  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)

# ロールに対するアクセス許可を更新する
<a name="id_roles_update-role-permissions"></a>

ロールのアクセス許可ポリシーとアクセス許可の境界を更新するには、以下の手順を使用します。

## 前提条件: ロールへのアクセスを表示する
<a name="roles-modify_prerequisites"></a>

ロールのアクセス許可を変更する前に、サービスレベルの最近のアクティビティを確認する必要があります。これは、アクセス権を使用しているプリンシパル (ユーザーまたはアプリケーション) から削除しないようにするために重要です。最後にアクセスした情報を表示する方法の詳細については、「[最終アクセス情報を使用して AWS のアクセス許可を調整する](access_policies_last-accessed.md)」を参照してください。

## ロールに対するアクセス許可ポリシーを更新する
<a name="id_roles_update-role-permissions-policy"></a>

ロールで許可されているアクセス許可を変更するには、ロールのアクセス許可のポリシーを修正します。IAM の*[サービスにリンクされたロール](id_roles.md#iam-term-service-linked-role)*のアクセス許可ポリシーは変更できません。ロールに依存するサービス内では、アクセス許可ポリシーを変更できる場合があります。サービスでこの機能がサポートされているかどうかを確認するには、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照し、**[Service-linked roles]** (サービスにリンクされたロール) 列が **[Yes]** (はい) となっているサービスを探します。サービスリンクロールに関するドキュメントをサービスで表示するには、リンクで **[はい]** を選択します。

### ロールに対するアクセス許可ポリシーの更新 (コンソール)
<a name="id_roles_update-role-permissions-policy-console"></a>

**ロールで許可されているアクセス権限を変更するには (コンソール)**

1. IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. IAM コンソールのナビゲーションペインで **[ロール]** を選択します。

1. 変更するロールの名前を選択し、[**Permissions (アクセス許可)**] タブを選択します。

1. 次のいずれかを行います。
   + 既存のカスタマー管理ポリシーを編集するには、ポリシーの名前を選択してから [**ポリシーの編集**] を選択します。
**注記**  
AWS の管理ポリシーを編集することはできません。AWS 管理ポリシーには AWS アイコン (![\[Orange cube icon indicating a policy is managed by AWS.\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/policy_icon.png)) が表示されます。AWS 管理ポリシーとカスタマー管理ポリシーの違いの詳細については、「[管理ポリシーとインラインポリシー](access_policies_managed-vs-inline.md)」を参照してください。
   + 既存の管理ポリシーをロールにアタッチするには、**[Add permissions]** (アクセス許可を追加) を選択して、**[Attach policies]** (ポリシーのアタッチ) を選択します。
   + 既存のインラインポリシーを編集するには、ポリシーを展開して、**[Edit]** (編集) を選択します。
   + 新しいインラインポリシーを埋め込むには、**[Add permissions]** (アクセス許可を追加) を選択して、**[Create inline policy]** (インラインポリシーの作成) を選択します。
   + ロールから既存のポリシーを削除するには、ポリシー名の横にあるチェックボックスを選択し、**[削除]** を選択します。

### ロールに対するアクセス許可ポリシーの更新 (AWS CLI)
<a name="id_roles_update_permissions-policy-cli"></a>

ロールで許可されているアクセス許可を変更するには、ロールのアクセス許可のポリシーを修正します。IAM の*[サービスにリンクされたロール](id_roles.md#iam-term-service-linked-role)*のアクセス許可ポリシーは変更できません。ロールに依存するサービス内では、アクセス許可ポリシーを変更できる場合があります。サービスでこの機能がサポートされているかどうかを確認するには、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照し、**[Service-linked roles]** (サービスにリンクされたロール) 列が **[Yes]** (はい) となっているサービスを探します。サービスリンクロールに関するドキュメントをサービスで表示するには、リンクで **[はい]** を選択します。

**ロールで許可されたアクセス許可を変更するには (AWS CLI)**

1. (オプション) ロールに現在関連付けられているアクセス許可を表示するには、以下のコマンドを実行します。

   1. [aws iam list-role-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-role-policies.html) (インラインポリシーの一覧表示)

   1. [aws iam list-attached-role-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-attached-role-policies.html) (管理ポリシーの一覧表示)

1. ロールのアクセス権限を更新するコマンドは、管理ポリシーとインラインポリシーのいずれを更新するかによって異なります。

   管理ポリシーを更新するには、次のコマンドを実行して新しいバージョンの管理ポリシーを作成します。
   + [aws iam create-policy-version](https://docs.aws.amazon.com/cli/latest/reference/iam/create-policy-version.html)

   インラインポリシーを更新するには、次のコマンドを実行します。
   + [aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html)

### ロールに対するアクセス許可ポリシーの更新 (AWS API)
<a name="id_roles_update_permissions-policy-api"></a>

ロールで許可されているアクセス許可を変更するには、ロールのアクセス許可のポリシーを修正します。IAM の*[サービスにリンクされたロール](id_roles.md#iam-term-service-linked-role)*のアクセス許可ポリシーは変更できません。ロールに依存するサービス内では、アクセス許可ポリシーを変更できる場合があります。サービスでこの機能がサポートされているかどうかを確認するには、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照し、**[Service-linked roles]** (サービスにリンクされたロール) 列が **[Yes]** (はい) となっているサービスを探します。サービスリンクロールに関するドキュメントをサービスで表示するには、リンクで **[はい]** を選択します。

**ロールで許可されたアクセス許可を変更するには (AWS API)**

1. (オプション) ロールに現在関連付けられているアクセス許可を表示するには、以下のオペレーションを呼び出します。

   1. [ListRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html) (インラインポリシーの一覧表示)

   1. [ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html) (管理ポリシーの一覧表示)

1. ロールのアクセス許可を更新するオペレーションは、管理ポリシーとインラインポリシーのいずれを更新するかによって異なります。

   管理ポリシーを更新するには、次のオペレーションを呼び出して新しいバージョンの管理ポリシーを作成します。
   + [CreatePolicyVersion](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicyVersion.html)

   インラインポリシーを更新するには、次のオペレーションを呼び出します。
   + [PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html)

## ロールに対するアクセス許可の境界を更新する
<a name="id_roles_update-role-permissions-boundary"></a>

ロールに許可されるアクセス許可の上限を変更するには、ロールの[アクセス許可の境界](access_policies_boundaries.md)を変更します。

### ロールに対するアクセス許可の境界の更新 (コンソール)
<a name="id_roles_update-permissions-boundary-console"></a>

**ロールのアクセス許可の境界を設定するために使用するポリシーを変更するには**

1. AWS マネジメントコンソール にサインインして、[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で IAM コンソールを開きます。

1. ナビゲーションペインで **Roles (ロール)** を選択します。

1. 変更する[permissions boundary](access_policies_boundaries.md) (許可の境界) を持つロールの名前を選択します。

1. **[アクセス許可]** タブを選択します。必要に応じて、[**Permissions boundary (アクセス許可の境界)**] セクションを開き、[**Change boundary (境界の変更)**] を選択します。

1. アクセス許可の境界として使用するポリシーを選択します。

1. [**Change boundary (境界の変更)**] を選択します。

   変更は、次にこのロールが引き受けられるまで有効になりません。

### ロールに対するアクセス許可の境界の変更 (AWS CLI)
<a name="id_roles_update_permissions-boundary-cli"></a>

**ロールのアクセス許可の境界を設定するために使用する管理ポリシーを変更するには (AWS CLI)**

1. (オプション) ロールの現在の[アクセス許可の境界](access_policies_boundaries.md)を表示するには、以下のコマンドを実行します。
   + [aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. 別の管理ポリシーを使用してロールのアクセス許可の境界を更新するには、次のコマンドを実行します。
   + [aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html)

   ロールにアクセス許可の境界として設定できる管理ポリシーは 1 つのみです。アクセス許可の境界を変更する場合は、ロールに許可されるアクセス許可の上限を変更します。

### ロールに対するアクセス許可の境界の更新 (AWS API)
<a name="id_roles_update-permissions-boundary-api"></a>

**ロールのアクセス許可の境界を設定するために使用する管理ポリシーを変更するには (AWS API)**

1. (オプション) ロールの現在の[アクセス許可の境界](access_policies_boundaries.md)を表示するには、以下のオペレーションを呼び出します。
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html)

1. 別の管理ポリシーを使用してロールのアクセス許可の境界を更新するには、次のオペレーションを呼び出します。
   + [PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html)

   ロールにアクセス許可の境界として設定できる管理ポリシーは 1 つのみです。アクセス許可の境界を変更する場合は、ロールに許可されるアクセス許可の上限を変更します。

# ロールの設定を更新する
<a name="id_roles_update-role-settings"></a>

ロールの説明を更新したり、ロールの最大セッション期間を変更したりするには、以下の手順を使用します。

## ロールの説明を更新する
<a name="id_roles_update-description"></a>

ロールの説明を変更するには、説明テキストを変更します。

### ロールの説明の更新 (コンソール)
<a name="id_roles_update-description-console"></a>

**ロールの説明を変更するには (コンソール)**

1. AWS マネジメントコンソール にサインインして、IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. IAM コンソールのナビゲーションペインで **[ロール]** を選択します。

1. 変更するロールの名前を選択します。

1. **[Summary]** (概要) セクションで **[Edit]** (編集) を選択します。

1. ボックスに新しい説明を入力し、**[Save changes]** (変更の保存) を選択します。

### ロールの説明の更新 (AWS CLI)
<a name="id_roles_update-description-cli"></a>

**ロールの説明を変更するには (AWS CLI)**

1. (オプション) ロールの現在の説明を表示するには、次のコマンドを実行します。
   + [aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. ロールの説明を更新するには、説明パラメータを指定して、次のコマンドを実行します。
   + [aws iam update-role](https://docs.aws.amazon.com/cli/latest/reference/iam/update-role.html)

### ロールの説明の更新 (AWS API)
<a name="id_roles_update-description-api"></a>

**ロールの説明を変更するには (AWS API)**

1. (オプション) ロールの現在の説明を表示するには、次のオペレーションを呼び出します。
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html) 

1. ロールの説明を更新するには、説明パラメータを指定して、次のオペレーションを呼び出します。
   + [UpdateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateRole.html)

## ロールの最大セッション期間を更新する
<a name="id_roles_update-session-duration"></a>

コンソール、AWS CLI または AWS API を使用して、引き受けるロールの最大セッション期間設定を指定するには、最大セッション期間設定の値を変更します。この設定の値は 1 時間～ 12 時間です。値を指定しない場合、デフォルトの最大 1 時間が適用されます。この設定では、AWS サービスが引き受けるセッションは制限されません。

### ロールの最大セッション期間の更新 (コンソール)
<a name="id_roles_update-session-duration-console"></a><a name="id_roles_modify_max-session"></a>

**コンソール、AWS CLI または AWS API を使用して引き受けたロールの最大セッション期間設定を変更するには (コンソール)**

1. AWS マネジメントコンソール にサインインして、IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. IAM コンソールのナビゲーションペインで **[ロール]** を選択します。

1. 変更するロールの名前を選択します。

1. **[Summary]** (概要) セクションで **[Edit]** (編集) を選択します。

1. **[Maximum session duration]** (最大セッション期間) には、値を選択します。または、[**Custom duration**] (カスタム期間) を選択して、値 (秒単位) を入力します。

1. **[Save changes]** (変更の保存) をクリックします。

   変更は、次にこのロールが引き受けられるまで有効になりません。このロールの既存のセッションを取り消す方法については、「[IAM ロールの一時的なセキュリティ認証情報を取り消す](id_roles_use_revoke-sessions.md)」を参照してください。

AWS マネジメントコンソール の場合、IAM ユーザーセッションはデフォルトで 12 時間です。コンソールでロールを切り替える IAM ユーザーには、ロールに設定された最大セッション期間、または ユーザーのセッションの残り時間のいずれか短い方が付与されます。

AWS CLI または AWS API からロールを引き受けるユーザーは、この最大数まで長いセッションを要求できます。`MaxSessionDuration` 設定は、リクエストできるロールセッションの最大セッション期間を決定します。
+ AWS CLI を使用してセッション期間を指定するには、`duration-seconds` パラメータを使用します。詳細については[IAM ロールに切り替える (AWS CLI)](id_roles_use_switch-role-cli.md)を参照してください。
+ AWS API を使用してセッション期間を指定するには、`DurationSeconds` パラメータを使用します。詳細については[IAM ロールを切り替える (AWS)](id_roles_use_switch-role-api.md)を参照してください。

### ロールの最大セッション期間の更新 (AWS CLI)
<a name="id_roles_update-session-duration-cli"></a>

**注記**  
AWS CLI または API からロールを引き受けると、`duration-seconds` CLI パラメータまたは `DurationSeconds` API パラメータを使用して、より長いロールセッションをリクエストできます。`MaxSessionDuration` 設定は、`DurationSeconds` パラメータを使用してリクエストできるロールセッションの最大セッション期間を決定します。`DurationSeconds` パラメータの値を指定しない場合、セキュリティ認証情報は 1 時間有効です。

**引き受けたロールの最大セッション継続時間設定を AWS CLI で変更するには (AWS CLI)**

1. (オプション) ロールの現在の最大セッション継続時間設定を表示するには、次のコマンドを実行します。
   + [aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. ロールの最大セッション継続時間設定を更新するには、`max-session-duration` CLI パラメータまたは `MaxSessionDuration` API パラメータを指定して、次のコマンドを実行します。
   + [aws iam update-role](https://docs.aws.amazon.com/cli/latest/reference/iam/update-role.html)

   変更は、次にこのロールが引き受けられるまで有効になりません。このロールの既存のセッションを取り消す方法については、「[IAM ロールの一時的なセキュリティ認証情報を取り消す](id_roles_use_revoke-sessions.md)」を参照してください。

### ロールの最大セッション時間の更新 (AWS API)
<a name="id_roles_update-session-duration-api"></a>

**注記**  
AWS CLI または API からロールを引き受けると、`duration-seconds` CLI パラメータまたは `DurationSeconds` API パラメータを使用して、より長いロールセッションをリクエストできます。`MaxSessionDuration` 設定は、`DurationSeconds` パラメータを使用してリクエストできるロールセッションの最大セッション期間を決定します。`DurationSeconds` パラメータの値を指定しない場合、セキュリティ認証情報は 1 時間有効です。

**引き受けたロールの最大セッション継続時間設定を API で変更するには (AWS API)**

1. (オプション) ロールの現在の最大セッション継続時間設定を表示するには、次のオペレーションを呼び出します。
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html) 

1. ロールの最大セッション継続時間設定を更新するには、`max-sessionduration` CLI パラメータまたは `MaxSessionDuration` API パラメータを指定して、次のオペレーションを呼び出します。
   + [UpdateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateRole.html)

   変更は、次にこのロールが引き受けられるまで有効になりません。このロールの既存のセッションを取り消す方法については、「[IAM ロールの一時的なセキュリティ認証情報を取り消す](id_roles_use_revoke-sessions.md)」を参照してください。

# ロールまたはインスタンスプロファイルを削除する
<a name="id_roles_manage_delete"></a>

ロールが不要になった場合は、ロールとその関連する権限を削除することをお勧めします。そうすることで、使用していないエンティティがアクティブにモニタリングされたり、メンテナンスされたりすることがなくなります。

ロールが EC2 インスタンスに関連付けられている場合、インスタンスプロファイルからロールを削除した後、インスタンスプロファイルを削除することもできます。

**警告**  
削除しようとしているロールまたはインスタンスプロファイルで実行されている Amazon EC2 インスタンスがないことを確認してください。実行中のインスタンスに関連付けられているロールまたはインスタンスプロファイルを削除すると、そのインスタンスで実行されているすべてのアプリケーションが中断されます。

ロールを完全に削除しない場合は、ロールを無効にできます。そのためには、ロールのポリシーを変更してから、現在のすべてのセッションを取り消します。例えば、ロールに、すべての AWS へのアクセスを拒否したポリシーを追加できます。ロールを引き受けようとするすべてのユーザーへのアクセスを拒否するように、信頼ポリシーを編集することもできます。セッションの取り消しの詳細については、「[IAM ロールの一時的なセキュリティ認証情報を取り消す](id_roles_use_revoke-sessions.md)」を参照してください。

**Topics**
+ [

## ロールへのアクセスの表示
](#roles-delete_prerequisites)
+ [

## サービスにリンクされたロールの削除
](#id_roles_manage_delete_slr)
+ [

## IAM ロールの削除 (コンソール)
](#roles-managingrole-deleting-console)
+ [

## IAM ロール（AWS CLI) の削除
](#roles-managingrole-deleting-cli)
+ [

## IAM ロールの削除 (AWS API)
](#roles-managingrole-deleting-api)
+ [

## 関連情報
](#roles-managingrole-deleting-related-info)

## ロールへのアクセスの表示
<a name="roles-delete_prerequisites"></a>

ロールを削除する前に、ロールが最後に使用された日時を確認することをお勧めします。これを行うには、AWS マネジメントコンソール、AWS CLI、または AWS API を使用します。ロールを使用しているユーザーからアクセスを削除したくないため、この情報を表示する必要があります。

ロールの最後のアクティビティの日付が、**[最終アクセス]** タブで報告された最後の日付と一致しない場合があります。[**[最終アクセス]**](access_policies_last-accessed-view-data.md) タブでは、ロールのアクセス許可ポリシーで許可されているサービスのアクティビティのみがレポートされます。ロールの最後のアクティビティの日付には、AWS でサービスにアクセスしようとした最後の試みが含まれます。

**注記**  
ロールの直近のアクティビティと Last Accessed データの追跡期間は、400 日間です。ユーザーのリージョンが昨年内にこれらの機能をサポートし始めた場合、この期間は短くなる可能性があります。このロールは 400 日以上前に使用された可能性があります。追跡期間の詳細については、「[AWS が最終アクセス情報を追跡する場所](access_policies_last-accessed.md#last-accessed_tracking-period)」を参照してください。

**ロールが最後に使用された日時を表示するには（コンソール）**

1. AWS マネジメントコンソール にサインインして、[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で IAM コンソールを開きます。

1. ナビゲーションペインで **Roles (ロール)** を選択します。

1. アクティビティを表示するロールの行を探します。検索フィールドを使用して結果を絞り込むことができます。[**Last activity (最後のアクティビティ)**] 列を表示して、ロールが最後に使用されてからの日数を確認します。ロールが追跡期間内に使用されていない場合、テーブルには [**None (なし)**] と表示されます。

1. 詳細情報を表示するには、ロールの名前を選択します。ロールの [**Summary (概要)**] ページには、ロールが最後に使用された日付を表示する [**Last activity (最後のアクティビティ)**] も含まれます。ロールが過去 400 日以内に使用されていない場合、[**Last activity (最後のアクティビティ)**] には [**Not accessed in the tracking period (追跡期間中にアクセスされていません)**] と表示されます。

**ロールが最後に使用された日時を表示するには (AWS CLI)**  
`[aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)` - `RoleLastUsed` オブジェクトを含むロールに関する情報を返すには、このコマンドを実行します。このオブジェクトには、ロールが最後に使用された `LastUsedDate` と `Region` が含まれます。`RoleLastUsed` が存在しても値が含まれていない場合、ロールは追跡期間内に使用されていません。

**ロールが最後に使用された日時を表示するには (AWS API)**  
`[GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/GetRole.html)` - このオペレーションを呼び出して、`RoleLastUsed` オブジェクトを含むロールに関する情報を返します。このオブジェクトには、ロールが最後に使用された `LastUsedDate` と `Region` が含まれます。`RoleLastUsed` が存在しても値が含まれていない場合、ロールは追跡期間内に使用されていません。

## サービスにリンクされたロールの削除
<a name="id_roles_manage_delete_slr"></a>

サービスにリンクされたロールを削除する方法は、サービスによって異なります。場合によっては、サービスにリンクされたロールを手動で削除する必要はありません。たとえば、サービス特定のアクション (リソースの削除) を完了すると、サービスによって、サービスにリンクされたロールが削除される場合があります。また、サービスにリンクされたロールは、サービスコンソール、API、または AWS CLI から手動で削除できる場合があります。

リンクされたサービスで[サービスにリンクされたロール](id_roles.md#iam-term-service-linked-role)に関するドキュメントを参照して、ロールを削除する方法を確認します。アカウントのサービスにリンクされたロールを表示するには、コンソールの [IAM **ロール**] ページに移動します。サービスにリンクされたロールが、テーブルの **[Trusted entities]** (信頼されたエンティティ) 列の **[(Service-linked role)]** ((サービスにリンクされたロール)) に表示されます。ロールの [**Summary (概要)**] ページのバナーにも、そのロールがサービスにリンクされたロールであることが示されています。

サービスにリンクされたロールを削除するためのドキュメントがサービスに含まれていない場合は、IAM コンソール、AWS CLI、または API を使用してロールを削除できます。

## IAM ロールの削除 (コンソール)
<a name="roles-managingrole-deleting-console"></a>

AWS マネジメントコンソール を使用してロールを削除すると、IAM ではロールに関連付けられた管理ポリシーも自動的にデタッチされます。また、ロールに関連したインラインポリシーとロールを含む Amazon EC2 インスタンスプロファイルも自動的に削除されます。

**重要**  
場合によっては、ロールは、Amazon EC2 インスタンスプロファイルに関連付いていることがあります。また、ロールとインスタンスプロファイルの名前が同じ場合があります。このような場合は、AWS マネジメントコンソール を使用して、ロールやインスタンスプロファイルを削除できます。この関連付けは、コンソールで作成したロールとインスタンスプロファイルに対して自動的に行われます。AWS CLI、Tools for Windows PowerShell、または AWS API からロールを作成した場合は、ロールとインスタンスプロファイルで名前が異なることがあります。その場合、コンソールを使用してそれらのロールを削除することはできません。代わりに、まず、AWS CLI、Tools for Windows PowerShell、または AWS API を使用して、インスタンスプロファイルからロールを削除する必要があります。その後、ロールを削除する別の手順を実行する必要があります。

**ロールを削除するには (コンソール)**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. ナビゲーションペインで、[**ロール**] を選択し、削除するロール名の隣にあるチェックボックスをオンにします。

1. ページの上部で、[**削除**] を選択します。

1. 確認ダイアログボックスで、最終アクセス情報を確認します。これは、選択したそれぞれのロールの AWS サービスへの最終アクセス時間を示します。これは、そのロールが現在アクティブであるかどうかを確認するのに役立ちます。続行する場合は、テキスト入力フィールドにロール名を入力し、**削除**を選択します。確実に削除する場合は、最終アクセス情報をまだロード中であっても、削除を実行できます。

**注記**  
ロールと同じ名前でない限り、コンソールを使用してインスタンスプロファイルを削除することはできません。ロールを削除する過程でインスタンスプロファイルを削除する必要があります。ロールを同時に削除することなくインスタンスプロファイルを削除するには、AWS CLI または AWS API を使用する必要があります。詳細については、次のセクションを参照してください。

## IAM ロール（AWS CLI) の削除
<a name="roles-managingrole-deleting-cli"></a>

AWS CLI を使用してロールを削除する場合、最初にそのロールに関連したインラインポリシーを削除しなければなりません。また、ロールに関連付けられた管理ポリシーもデタッチする必要があります。ロールを含む関連付けられたインスタンスプロファイルを削除する場合は、別途、削除する必要があります。

**ロールを削除するには (AWS CLI)**

1. 削除するロールの名前が分からない場合、以下のコマンドを入力してお客様のアカウントにあるロールを表示します。

   ```
   aws iam list-roles
   ```

   リストには、各ロールの Amazon リソースネーム (ARN) が含まれます。CLI コマンドでは、ARN ではなくロール名を使用してロールを参照します。例えば、ロールの ARN が `arn:aws:iam::123456789012:role/myrole` である場合、そのロールを **myrole** と参照します。

1. ロールが関連付けられたすべてのインスタンスプロファイルからロールを削除します。

   1. そのロールが関連付けられているすべてのインスタンスプロファイルを表示するには、以下のコマンドを入力します。

      ```
      aws iam list-instance-profiles-for-role --role-name role-name
      ```

   1. 各インスタンスプロファイルで以下のコマンドを入力して、インスタンスプロファイルからロールを削除します。

      ```
      aws iam remove-role-from-instance-profile --instance-profile-name instance-profile-name --role-name role-name
      ```

1. そのロールに関連するすべてのポリシーを削除します。

   1. ロールに存在するすべてのインラインポリシーを一覧表示するには、以下のコマンドを入力します。

      ```
      aws iam list-role-policies --role-name role-name
      ```

   1. ロールから各インラインポリシーを削除するには、各ポリシーで以下のコマンドを入力します。

      ```
      aws iam delete-role-policy --role-name role-name --policy-name policy-name
      ```

   1. ロールにアタッチされたすべてのマネージドポリシーを一覧表示するには、以下のコマンドを入力します。

      ```
      aws iam list-attached-role-policies --role-name role-name
      ```

   1. ロールから各マネージドポリシーをデタッチするには、各ポリシーで以下のコマンドを入力します。

      ```
      aws iam detach-role-policy --role-name role-name --policy-arn policy-arn
      ```

1. 次のコマンドを入力してロールを削除します。

   ```
   aws iam delete-role --role-name role-name
   ```

1. そのロールに関連付けられたインスタンスプロファイルを再利用する予定がない場合、以下のコマンドを入力して削除できます。

   ```
   aws iam delete-instance-profile --instance-profile-name instance-profile-name
   ```

## IAM ロールの削除 (AWS API)
<a name="roles-managingrole-deleting-api"></a>

IAM API を使用してロールを削除する場合、最初にそのロールに関連したインラインポリシーを削除しなければなりません。また、ロールに関連付けられた管理ポリシーもデタッチする必要があります。ロールを含む関連付けられたインスタンスプロファイルを削除する場合は、別途、削除する必要があります。

**ロールを削除するには (AWS API)**

1. ロールが関連付けられたすべてのインスタンスプロファイルを一覧表示するには、[ListInstanceProfilesForRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfilesForRole.html) を呼び出します。

   インスタンスプロファイルからロールを削除するには、[RemoveRoleFromInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html) を呼び出します。ロール名およびインスタンスプロファイル名を引き渡さなければいけません。

   そのロールに関連付けられていたインスタンスプロファイルを再利用しない場合、[DeleteInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html) を呼び出して削除します。

1. ロールのすべてのインラインポリシーを一覧表示するには、[ListRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html) を呼び出します。

   ロールに関連付けられたインラインポリシーを削除するには、[DeleteRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteRolePolicy.html) を呼び出します。ロール名およびインラインポリシー名を渡す必要があります。

1. ロールにアタッチされたすべてのマネージドポリシーを一覧表示するには、[ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html) を呼び出します。

   ロールにアタッチされたマネージドポリシーをデタッチするには、[DetachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachRolePolicy.html) を呼び出します。ロール名およびマネージドポリシー ARN を渡す必要があります。

1. ロールを削除するには、[DeleteRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteRole.html) を呼び出します。

## 関連情報
<a name="roles-managingrole-deleting-related-info"></a>

インスタンスプロファイルの一般的な情報については、[インスタンスプロファイルを使用する](id_roles_use_switch-role-ec2_instance-profiles.md)を参照してください。

サービスにリンクされたロールの一般情報については、「[サービスにリンクされたロールの作成](id_roles_create-service-linked-role.md)」を参照してください。

# ロールを引き受けるための各種方法
<a name="id_roles_manage-assume"></a>

作成したロールをユーザー、アプリケーション、またはサービスが使用できるようにするには、該当のロールに[切り替えるためのアクセス許可を付与する](id_roles_use_permissions-to-switch.md)必要があります。グループまたはユーザーにアタッチされたポリシーを使用して、必要なアクセス許可を付与することができます。アクセス許可が付与されると、ユーザーは、AWS マネジメントコンソール、Tools for Windows PowerShell、AWS Command Line Interface (AWS CLI)、および [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API からロールを引き受けることができます。

**重要**  
ロールの作成を IAM コンソールではなくプログラムで行う場合は、最大 64 文字までの `Path` に加えて最大 512 文字までの `RoleName` を追加できます。ただし、AWS マネジメントコンソール の [**ロールの切り替え**] 機能でロールを使用する場合は、`Path` と `RoleName` の合計が 64 文字を超えることはできません。

ロールを引き受けるために使用される方法によって、誰がロールを引き受けることができるか、およびロールセッションがどのくらい続くかが決まります。`AssumeRole*` API オペレーションを使用する場合、引き受ける IAM ロールはリソースです。`AssumeRole*` API オペレーションを呼び出す ユーザーまたはロールはプリンシパルです。

次の表は、ロールを引き受ける方法を比較したものです。


|  ロールを引き受ける方法 |  **だれがロールを引き受けるか**  | **認証情報の有効期間を指定する方法** |  **認証情報の有効期間 (最小 \$1 最大 \$1 デフォルト)**  | 
| --- | --- | --- | --- | 
| AWS マネジメントコンソール | ユーザーまたは ([ロールの切り替え](id_roles_use_switch-role-console.md)による) ロール¹ | 最大セッション期間でロールの [概要] ページ | 15 分 \$1 最大セッション期間設定² \$1 1 時間 | 
| [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 または [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API オペレーション |  ユーザーまたはロール¹ | duration-seconds CLI または DurationSeconds API パラメータ | 15 分 \$1 最大セッション期間設定² \$1 1 時間  | 
| [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 または [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API オペレーション | SAML を使用して認証されたユーザー | duration-seconds CLI または DurationSeconds API パラメータ | 15 分 \$1 最大セッション期間設定² \$1 1 時間  | 
| [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 または [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API オペレーション | OIDC プロバイダーを使用して認証されたユーザー | duration-seconds CLI または DurationSeconds API パラメータ | 15 分 \$1 最大セッション期間設定² \$1 1 時間  | 
| [ を使用して構築された](id_roles_providers_enable-console-custom-url.md)コンソール URLAssumeRole  | ユーザーまたはロール | URL の SessionDuration HTML パラメータ | 15 分 \$1 12 時間 \$1 1 時間  | 
| [ を使用して構築された](id_roles_providers_enable-console-custom-url.md)コンソール URLAssumeRoleWithSAML  | SAML を使用して認証されたユーザー | URL の SessionDuration HTML パラメータ | 15 分 \$1 12 時間 \$1 1 時間 | 
| [ を使用して構築された](id_roles_providers_enable-console-custom-url.md)コンソール URLAssumeRoleWithWebIdentity  | OIDC プロバイダーを使用して認証されたユーザー | URL の SessionDuration HTML パラメータ | 15 分 \$1 12 時間 \$1 1 時間  | 

¹ 1 つのロールの認証情報を使用して別のロールを引き受けることを[ロールの連鎖](id_roles.md#iam-term-role-chaining)と言います。ロールの連鎖を使用する場合、ロールのセッション期間は 1 時間に制限されます。これは、AWS マネジメントコンソール ロールの切り替え、AWS CLI、API オペレーションに適用されます。この制限は、ユーザー認証情報からロールを最初に引き受ける場合や、インスタンスプロファイルを使用して Amazon EC2 インスタンスで実行しているアプリケーションには適用されません。

² この設定の値は 1 時間～ 12 時間です。最大セッション期間設定の修正の詳細については、「[IAM ロールの管理](id_roles_manage.md)」を参照してください。この設定は、ロールの認証情報を取得したときにリクエストできる最大セッション期間設定を決定します。たとえば、[AssumeRole\$1](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API オペレーションを使用してロールを引き受ける場合は、`DurationSeconds` パラメータの値を使用してセッションの期間を指定できます。このパラメータを使用して、ロールセッションの期間を 900 秒 (15 分) からそのロールの最大セッション期間設定まで指定できます。コンソールでロールを切り替える IAM ユーザーには、最大セッション期間、またはユーザーのセッションの残り時間のいずれか短い方が付与されます。ロールに 5 時間の最大期間を設定することを想定しています。コンソールに 10 時間（デフォルトの最大 12 時間）サインインした IAM ユーザーがロールに切り替わります。使用可能なロールセッション期間は 2 時間です。ロールの最大値を確認する方法については、このページで後述する「[ロールの最大セッション期間を更新する](id_roles_update-role-settings.md#id_roles_update-session-duration)」を参照してください。

**メモ**  
最大セッション期間の設定では、AWS サービスが引き受けるセッションは制限されません。
Amazon EC2 IAM ロールの認証情報はロールで設定された最大セッション期間の対象にはなりません。
ロールセッション内でユーザーが現在のロールを再び引き受けることができるようにするには、ロール信頼ポリシーでロール ARN または AWS アカウント ARN をプリンシパルとして指定します。Amazon EC2、Amazon ECS、Amazon EKS、Lambda などのコンピューティングリソースを提供する AWS のサービス は、一時的な認証情報を提供し、これらの認証情報を自動的に更新します。これにより、常に有効な認証情報セットを確保できます。これらのサービスでは、一時的な認証情報を取得するために現在のロールを再度引き受ける必要はありません。ただし、[セッションタグ](id_session-tags.md)または[セッションポリシー](access_policies.md#policies_session)を渡す場合は、現在のロールを再度引き受ける必要があります。ロールの信頼ポリシーを変更してプリンシパルロールの ARN または AWS アカウント ARN を追加する方法については、[ロール信頼ポリシーを更新する](id_roles_update-role-trust-policy.md) を参照してください。

**Topics**
+ [

# ユーザーから IAM ロールに切り替える (コンソール)
](id_roles_use_switch-role-console.md)
+ [

# IAM ロールに切り替える (AWS CLI)
](id_roles_use_switch-role-cli.md)
+ [

# IAM ロールに切り替える (Tools for Windows PowerShell)
](id_roles_use_switch-role-twp.md)
+ [

# IAM ロールを切り替える (AWS)
](id_roles_use_switch-role-api.md)
+ [

# Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用してアクセス許可を付与する
](id_roles_use_switch-role-ec2.md)
+ [

# インスタンスプロファイルを使用する
](id_roles_use_switch-role-ec2_instance-profiles.md)

# ユーザーから IAM ロールに切り替える (コンソール)
<a name="id_roles_use_switch-role-console"></a>

IAM ユーザー、IAM Identity Center でのユーザー、SAML フェデレーションロール、またはウェブ ID フェデレーションロールとしてサインインするときにロールを切り替えられます。*ロール*は、必要な AWS リソースへのアクセスに使用できる一連のアクセス許可を指定します。ただし、ロールにはサインインされませんが、一度 IAM ユーザーとしてサインインすると IAM ロールに切り替えることができます。こうすると、元のユーザーアクセス権限が一時的に無効になり、そのロールに割り当てられたアクセス権限が代わりに付与されます。ロールは、自身のアカウントのロールでも、他の AWS アカウント のロールでもかまいません。ロール、その利点、作成方法の詳細については、「[IAM ロール](id_roles.md)」と「[IAM ロールの作成](id_roles_create.md)」を参照してください。

ユーザーと切り替え後のロールのアクセス許可は、累積されません。同時に有効になるアクセス権限のセットは 1 つのみです。ロールを切り替えると、ユーザーアクセス権限が一時的に無効になり、切り替え後のロールに割り当てられたアクセス権限が有効になります。そのロールを終了すると、ユーザーアクセス権限が自動的に復元されます。

AWS マネジメントコンソール でロールを切り替えると、コンソールは常に元の認可情報を使用して切り替えを認可します。例えば、RoleA に切り替える場合は、IAM は元の認証情報を使用して、RoleA の引き受けが許可されているかどうかを判断します。その後、*RoleA を使用中に* RoleB への切り替えを試みると、AWS は引き続き RoleA の認証情報ではなく**元の**認証情報を使用して切り替えを認可します。

**注記**  
IAM アイデンティティセンターのユーザーとして、SAML フェデレーテッドロールとして、またはウェブ ID フェデレーテッドロールとしてサインインすると、セッションの開始時に IAM ロールを引き受けます。例えば、IAM アイデンティティセンターのユーザーが AWS アクセスポータルにサインインする際には、AWS リソースにアクセスする前に、ロールに関連するアクセス許可セットを選択する必要があります。

## ロールセッション
<a name="id_roles_iam_user-switch-role-sessions"></a>

ロールを切り替えると、AWS マネジメントコンソール セッションはデフォルトで 1 時間続きます。IAM ユーザーセッションはデフォルトで 12 時間です。他のユーザーについては、異なるセッション時間が定義されている場合があります。コンソールでロールを切り替えると、ロールの最大セッション期間、またはユーザーセッションの残り時間のいずれか短い方が付与されます。ロールを引き受けることでセッション時間を延長することはできません。

たとえば、ロールに対して最大セッション期間が 10 時間に設定されているとします。ロールを切り替えることを決定するまでに、コンソールにサインインしてから 8 時間が経過していました。ユーザーセッションの残り時間は 4 時間であるため、許可されるロールセッション期間は、最大セッション期間の 10 時間ではなく、4 時間になります。次の表は、コンソールでロールを切り替えるときの IAM ユーザーのセッション期間を決定する方法を示しています。


| IAM ユーザーセッションの残り時間は..。 | ロールセッションの期間は..。 | 
| --- | --- | 
| ロールの最大セッション時間より小さい | ユーザーセッションでの残り時間 | 
| ロールの最大セッション時間の長さを超えています | 最大セッション期間値 | 
| ロールの最大セッション時間と同等 | 最大セッション継続時間値 (概算) | 

1 つのロールの認証情報を使用して別のロールを引き受けることを[ロールの連鎖](id_roles.md#iam-term-role-chaining)と言います。ロールの連鎖を使用する場合、個々のロールに設定された最大セッション期間の設定に関係なく、セッション期間は 1 時間に制限されます。これは、AWS マネジメントコンソール ロールの切り替え、AWS CLI、API オペレーションに適用されます。

**注記**  
ある程度 AWS サービスコンソールは、ロールセッションの有効期限が切れたときに、アクションを実行せずにロールセッションを自動更新できます。セッションを再認証するために、ブラウザページをリロードするように求めるメッセージが表示されることがあります。

## 考慮事項
<a name="id_roles_iam_user-switch-role-considerations"></a>
+ AWS アカウントのルートユーザー としてサインインすると、ロールを切り替えることはできません。
+ ロールを切り替えるためのアクセス許可が、ポリシーによってユーザーに付与されている必要があります。手順については、「[ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)」を参照してください。
+ AWS マネジメントコンソール で、[ExternalId](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id) 値を必要とするロールに切り替えることはできません。`ExternalId` パラメータをサポートする [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API を呼び出すことにより、このようなロールに切り替えることができます。

## ロールを切り替えるには
<a name="id_roles_iam_user-switch-role-console-procedure"></a>

1. 「*AWS サインインサインインユーザーガイド*」の「[AWS マネジメントコンソール へのサインイン方法](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)」のトピックで説明されているように、ユーザータイプに適したサインイン手順に従ってください。

1. AWS マネジメントコンソール で、右上のナビゲーションバーのユーザー名を選択します。通常は ***username*@*account\$1ID\$1number\$1or\$1alias*** のように表示されます。

1. ロールを切り替えるには、次のいずれかの方法を選択します。
   + **[ロールの切り替え]** を選択します。
   + マルチセッションサポートにオプトインしている場合は、**[セッションを追加]** を選択して **[ロールの切り替え]** を選択します。
**注記**  
AWS マネジメントコンソール では、1 つのウェブブラウザで最大 5 つの異なる ID に同時にサインインできます。詳細については、「*AWS マネジメントコンソール 入門ガイド*」の「[複数の入門ガイドアカウントへのサインイン](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/multisession.html)」を参照してください。

1. [**ロールの切り替え**] ページで、アカウント ID 番号またはアカウントエイリアスと、管理者により提供されたロールの名前を入力します。
**注記**  
管理者が `division_abc/subdivision_efg/roleToDoX` などのパスを使用してロールを作成した場合は、[**ロール**] ボックスに完全なパスと名前を入力する必要があります。ロール名のみを入力した場合、または `Path` と `RoleName` の組み合わせの合計が 64 文字を超える場合は、ロールの切り替えは失敗します。これは、ロール名を保存するブラウザクッキーの制約です。この場合は、管理者に連絡して、パスとロール名のサイズを減らすことを依頼してください。

1. (オプション) 表示名を入力し、コンソールのナビゲーションバーでロールを強調表示する表示色を選択できます。
   + **[表示名]** で、このロールがアクティブな場合にユーザー名の代わりにナビゲーションバーに表示するテキストを入力します。名前の候補がアカウントとロールの情報に基づいて表示されますが、わかりやすい名前に変更できます。
   + **[表示色]** で、表示名を強調表示する色を選択します。

   名前と色から、ロールがアクティブになってアクセス権限が変わることがわかりやすくなります。たとえば、テスト環境にアクセスできるロールには、[**表示名**] に「**Test**」と入力し、[**色**] で緑を選択できます。本稼働環境にアクセスできるロールには、[**表示名**] に「**Production**」と入力し、[**色**] で赤を選択できます。

1. **[Switch Role]** (ロールの切り替え) を選択します。表示名と色によってナビゲーションバーのユーザー名が置き換えられ、そのロールにより付与されたアクセス許可を使用し始めることができます。

1. IAM ロールを必要とするタスクが完了したら、元のセッションに切り替えて戻ることができます。これにより、ロールによって付与される追加のアクセス許可が削除され、標準のアクセス許可に戻ります。

   1. IAM コンソールで、右上のナビゲーションバーでロールの [**表示名**] を選択します。

   1. **[スイッチバック]** を選択します。

      たとえば、アカウント番号 `123456789012` にユーザー名 `Richard` を使用してサインインしているとします。`admin-role` ロールの使用後に、ロールの使用を停止して元のアクセス許可に戻ります。ロールの使用を停止するには、**[admin-role @ 123456789012]** を選択し、**[スイッチバック]** を選択します。  
![\[IAM ロールの使用を停止し、元のユーザーに戻るためのスイッチバック機能の場所を示すグラフィックス。\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/role-stop-using.png)

**ヒント**  
最近使用したいくつかのロールがメニューに表示されます。次回いずれかのロールに切り替えたい場合は、そのロールを選択するだけで切り替えることができます。ロールがメニューに表示されない場合にのみ、アカウントとロールの情報を手動で入力する必要があります。

## その他のリソース
<a name="id_roles_use_switch-role-console_additional_resources"></a>
+ [ロールを切り替えるアクセス許可をユーザーに付与する](id_roles_use_permissions-to-switch.md)
+ [AWS サービスにロールを渡すアクセス許可をユーザーに付与する](id_roles_use_passrole.md)
+ [IAM ユーザーにアクセス許可を付与するロールを作成する](id_roles_create_for-user.md)
+ [AWS サービスにアクセス許可を委任するロールを作成する](id_roles_create_for-service.md)
+ [IAM ロールをトラブルシューティングする](troubleshoot_roles.md)

# IAM ロールに切り替える (AWS CLI)
<a name="id_roles_use_switch-role-cli"></a>

*ロール*は、必要な AWS リソースへのアクセスに使用できる一連のアクセス許可を指定します。その点では、[AWS Identity and Access Management（IAM）のユーザー](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)に似ています。ユーザーとしてサインインすると、特定の一連のアクセス許可が付与されます。ただし、ロールにはサインインされませんが、ユーザーとしてサインインした後でロールを切り替えることができます。こうすると、元のユーザーアクセス権限が一時的に無効になり、そのロールに割り当てられたアクセス権限が代わりに付与されます。ロールは、自身のアカウントのロールでも、他の AWS アカウント のロールでもかまいません。ロールとその利点、およびロールを作成して設定する方法については、「[IAM ロール](id_roles.md)」および「[IAM ロールの作成](id_roles_create.md)」を参照してください。ロールを引き受ける別の方法については、「[ロールを引き受けるための各種方法](id_roles_manage-assume.md)」を参照してください。

**重要**  
IAM ユーザーのアクセス許可および引き受けるロールは、累積されません。同時に有効になるアクセス権限のセットは 1 つのみです。ロールを引き受けると、以前のユーザーまたはロールのアクセス許可が一時的に無効になり、切り替え後のロールに割り当てられたアクセス許可が有効になります。そのロールを終了すると、ユーザーアクセス権限が自動的に復元されます。

IAM ユーザーとしてサインインしている場合、ロールを使用して AWS CLI コマンドを実行できます。また、[外部で認証されたユーザー](id_roles_providers.md) ([SAML](id_roles_providers_saml.md) または [OIDC](id_roles_providers_oidc.md)) としてサインインしている場合にも、ロールを使用して AWS CLI コマンドを実行できます。また、インスタンスプロファイルを経由して、ロールにアタッチされた Amazon EC2 インスタンス内部から AWS CLI コマンドを実行するロールを使用できます。AWS アカウントのルートユーザー としてサインインしているときに、ロールを引き受けることはできません。

[**ロールの連鎖**](id_roles.md#iam-term-role-chaining) — ロールの連鎖を使用することもできます。この連鎖は、ロールのアクセス許可を使用して 2 つ目のロールにアクセス許可を使用します。

デフォルトでは、ロールセッションは 1 時間です。`assume-role*` CLI オペレーションを使用してこのロールを引き受ける場合は、`duration-seconds` パラメータの値を指定できます。この値は 900 秒 (15 分) からロールの最大セッション期間設定までの範囲を指定できます。コンソールでロールを変更した場合、セッションの所要時間は最大 1 時間に制限されます。ロールの最大値を確認する方法については、「[ロールの最大セッション期間を更新する](id_roles_update-role-settings.md#id_roles_update-session-duration)」を参照してください。

ロールの連鎖を使用すると、セッション期間は最長である 1 時間に制限されます。この場合 `duration-seconds` パラメータを使用して 1 時間より大きい値を指定すると、オペレーションは失敗します。

## シナリオ例: 本稼働ロールに切り替える
<a name="switch-role-cli-scenario-prod-env"></a>

開発環境で作業している IAM ユーザーであるとします。このシナリオでは、[AWS CLI](https://aws.amazon.com/cli/) でコマンドラインを使用して実稼働環境を操作する必要が生じることがあります。1 つのアクセスキー認証情報のセットがすでに使用可能です。このセットは、標準の IAM ユーザーに割り当てられたアクセスキーペアである場合があります。または、SAML または OIDC のフェデレーティッドプリンシパルとしてサインインしている場合、ユーザーに最初に割り当てられたロールのアクセスキーペアである場合があります。現在のアクセス許可で特定の IAM ロールを引き受けることができるなら、AWS CLI 設定ファイルの「プロファイル」でそのロールを特定できます。このコマンドは、元のアイデンティティではなく、指定された IAM ロールのアクセス権限を使用して実行されます。このプロファイルを AWS CLI コマンドで指定すると、新しいロールを使用することになります。この場合、開発用アカウントの元のアクセス許可を同時に使用することはできません。同時に有効にできるアクセス許可のセットは 1 つのみであるためです。

**注記**  
セキュリティ上の理由から、管理者は [AWS CloudTrail ログを確認](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)して、AWS でアクションを実行したユーザーを調べることができます。管理者は、ロールを引き受けるときに、ソース ID またはロールセッション名の指定を要求する場合があります。詳細については、「[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)」および「[`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname)」を参照してください。

**本稼働ロールに切り替えるには (AWS CLI)**

1. <a name="step-configure-default"></a>AWS CLI をはじめて使用する場合は、まず、デフォルトの CLI プロファイルを設定する必要があります。コマンドプロンプトを開き、IAM ユーザーまたはフェデレーティッドロールからのアクセスキーを使用するように、AWS CLI を設定します。詳細については、「[AWS Command Line Interface ユーザーガイド](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-quick-configuration)」の「*AWS Command Line Interface の設定*。」を参照してください。

   以下のように、[aws configure](https://docs.aws.amazon.com/cli/latest/reference/configure/) コマンドを実行します。

   ```
   aws configure
   ```

   プロンプトが表示されたら、次の情報を入力します。

   ```
   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. Unix または Linux の `.aws/config` ファイル、または Windows の `C:\Users\USERNAME\.aws\config` ファイルに、ロールの新しいプロファイルを作成します。次の例では、`123456789012` アカウントの `ProductionAccessRole` ロールへの切り替えをする「`prodaccess`」というプロファイルを作成します。ロール ARN は、ロールを作成したアカウント管理者から入手します。このプロファイルが呼び出されると、AWS CLI は `source_profile` の認証情報を使用してロールのための認証情報をリクエストします。そのため、`source_profile` として参照されるアイデンティティは、`role_arn` で指定されたロールの `sts:AssumeRole` アクセス権限がなければなりません。

   ```
   [profile prodaccess]
       role_arn = arn:aws:iam::123456789012:role/ProductionAccessRole
       source_profile = default
   ```

1. 新しいプロファイルを作成した後、AWS CLI パラメータを指定した `--profile prodaccess` コマンドは、デフォルトのユーザーではなく、IAM ロールである `ProductionAccessRole` にアタッチされたアクセス権限により実行されます。

   ```
   aws iam list-users --profile prodaccess
   ```

   このコマンドが機能するのは、`ProductionAccessRole` に割り当てられたアクセス許可の下で現在の AWS アカウントのユーザーを一覧表示できる場合です。

1. 元の認証情報によって付与されるアクセス許可に戻すには、`--profile` パラメータなしでコマンドを実行します。AWS CLI は、「[Step 1](#step-configure-default)」で設定したデフォルトのプロファイルの認証情報の使用に戻ります。

詳細については、*AWS Command Line Interface ユーザーガイド*の「[ロールを引き受ける](https://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html)」を参照してください。

## シナリオ例: インスタンスプロファイルロールが他のアカウントのロールに切り替えることを許可する
<a name="switch-role-cli-scenario-ec2-instance"></a>

2 つの AWS アカウント を使用していて、Amazon EC2 インスタンスで実行されているアプリケーションが両方のアカウントで [AWS CLI](https://aws.amazon.com/cli/) コマンドを実行できるようにするとします。アカウント `111111111111` に EC2 インスタンスが存在すると仮定します。このインスタンスには、同じ `abcd` アカウント内の Amazon S3 バケットで読み取り専用の `amzn-s3-demo-bucket1` タスクをアプリケーションが実行する `111111111111` インスタンスプロファイルのロールが含まれています。ただし、アプリケーションは、アカウント `222222222222` でタスクを実行するために `efgh` クロスアカウントロールを引き受けることも許可されている必要があります。これを行うには、`abcd` EC2 インスタンスプロファイルのロールは次のアクセス許可ポリシーを持っている必要があります。

***アカウント 111111111111 `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"
        }
    ]
}
```

------

`efgh` クロスアカウントのロールが、同じ `amzn-s3-demo-bucket2` アカウント内の `222222222222` バケットで読み取り専用 Amazon S3 タスクを許可すると仮定します。これを行うには、`efgh` クロスアカウントのロールは、以下のアクセス許可ポリシーを持っている必要があります。

***アカウント 222222222222 `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"
            ]
        }
    ]
}
```

------

`efgh` ロールは `abcd` インスタンスプロファイルのロールがそれを引き受けることを許可する必要があります。これを行うには、`efgh` ロールは次の信頼ポリシーを持っている必要があります。

***アカウント 222222222222 `efgh` ロールの信頼ポリシー***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "efghTrustPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"}
        }
    ]
}
```

------

次にアカウント `222222222222` で AWS CLI コマンドを実行するには、CLI 設定ファイルを更新する必要があります。AWS CLI 設定ファイルで、`efgh` ロールを「プロファイル」として、`abcd` EC2 インスタンスプロファイルロールを「認証情報ソース」として識別します。次に、元の `abcd` ロールではなく、`efgh` ロールのアクセス許可で CLI コマンドが実行されます。

**注記**  
セキュリティ上の目的で、AWS CloudTrail を使用して、アカウントのロールの使用を監査することができます。CloudTrail ログで異なるプリンシパルのロールが使用されている場合にロールセッションを区別するには、ロールセッション名を使用できます。このトピックで説明しているように、AWS CLI がユーザーに代わってロールを引き受けると、ロールセッション名が自動的に `AWS-CLI-session-nnnnnnnn` の形式で作成されます。ここでは *nnnnnnnn* は [Unix エポック時刻](http://wikipedia.org/wiki/Unix_time) (1970 年 1 月 1 日午前 0 時 UTC からの秒数) 形式の時刻を表す整数です。詳細については、[AWS CloudTrail ユーザーガイド](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/eventreference.html) の「*CloudTrail イベントリファレンス*」を参照してください。

**EC2 インスタンスプロファイルのロールをクロスアカウントのロール (AWS CLI) に切り替えることができるようにするには**

1. デフォルトの CLI プロファイルを設定する必要はありません。代わりに、EC2 インスタンスプロファイルのメタデータから認証情報を読み込むことができます。ロールの新しいプロファイルを `.aws/config` ファイルに作成します。次の例では、`222222222222` アカウントのロール `efgh` に切り替える `instancecrossaccount` プロファイルを作成します。このプロファイルが呼び出されると、AWS CLI は EC2 インスタンスプロファイルのメタデータの認証情報を使用してロールの認証情報をリクエストします。そのため、EC2 インスタンスプロファイルのロールには、`role_arn` で指定されたロールに対する `sts:AssumeRole` アクセス許可が必要です。

   ```
   [profile instancecrossaccount]
   role_arn = arn:aws:iam::222222222222:role/efgh
   credential_source = Ec2InstanceMetadata
   ```

1. 新しいプロファイルを作成した後、パラメータ `--profile instancecrossaccount` を指定する すべての AWS CLI コマンドは、アカウント `222222222222` の `efgh` ロールにアタッチされたアクセス許可で実行されます。

   ```
   aws s3 ls amzn-s3-demo-bucket2 --profile instancecrossaccount
   ```

   このコマンドは、`efgh` ロールに割り当てられたアクセス許可で現在の AWS アカウント のユーザーを一覧表示できる場合に実行されます。

1. アカウント `111111111111` の元の EC2 インスタンスプロファイルのアクセス許可に戻るには、`--profile` パラメータなしで CLI コマンドを実行します。

詳細については、*AWS Command Line Interface ユーザーガイド*の「[ロールを引き受ける](https://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html)」を参照してください。

# IAM ロールに切り替える (Tools for Windows PowerShell)
<a name="id_roles_use_switch-role-twp"></a>

*ロール*は、必要な AWS リソースへのアクセスに使用できる一連のアクセス許可を指定します。その点では、[AWS Identity and Access Management（IAM）のユーザー](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)に似ています。ユーザーとしてサインインすると、特定の一連のアクセス許可が付与されます。ただし、ロールにはサインインされませんが、一度サインインするとロールを切り替えることもできます。こうすると、元のユーザーアクセス権限が一時的に無効になり、そのロールに割り当てられたアクセス権限が代わりに付与されます。ロールは、自身のアカウントのロールでも、他の AWS アカウント のロールでもかまいません。ロールとその利点、およびロールを作成して設定する方法については、「[IAM ロール](id_roles.md)」および「[IAM ロールの作成](id_roles_create.md)」を参照してください。

**重要**  
IAM ユーザーと切り替え後のロールのアクセス許可は、累積されません。同時に有効になるアクセス権限のセットは 1 つのみです。ロールを切り替えると、ユーザーアクセス権限が一時的に無効になり、切り替え後のロールに割り当てられたアクセス権限が有効になります。そのロールを終了すると、ユーザーアクセス権限が自動的に復元されます。

このセクションでは、AWS Tools for Windows PowerShell のコマンドラインで作業するときにロールを切り替える方法について説明します。

開発環境にアカウントがあり、場合によって、本稼働環境で [Tools for Windows PowerShell](https://aws.amazon.com/powershell/) のコマンドラインで作業する必要があるとします。1 つのアクセスキー認証情報のセットがすでに使用可能です。このセットは、標準の IAM ユーザーに割り当てられたアクセスキーペアです。または、SAML または OIDC のフェデレーティッドプリンシパルとしてサインインしている場合、ユーザーに最初に割り当てられたロールのアクセスキーペアである場合があります。これらの認証情報を使用して、パラメータとして新しいロールの ARN を渡す `Use-STSRole` コマンドレットを実行します。このコマンドは、リクエストされたロールの一時的なセキュリティ証明書を返します。それらの認証情報は、以降の PowerShell コマンドで、本稼働環境のリソースにアクセスするためのロールのアクセス権限と共に使用します。ロールの使用中に、開発アカウントのユーザーアクセス許可を使用することはできません。同時に有効になるアクセス許可のセットは 1 つに限られるためです。

**注記**  
セキュリティ上の理由から、管理者は [AWS CloudTrail ログを確認](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)して、AWS でアクションを実行したユーザーを調べることができます。管理者は、ロールを引き受けるときに、ソース ID またはロールセッション名の指定を要求する場合があります。詳細については、「[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)」および「[`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname)」を参照してください。

すべてのアクセスキーとトークンは例にすぎず、実際にはそのように使用できないことに注意してください。ライブ環境の適切な値に置き換えてください。

**ロールに切り替えるには (Tools for Windows PowerShell)**

1. PowerShell コマンドプロンプトを開き、現在の IAM ユーザーまたはフェデレーションロールのアクセスキーを使用するように、デフォルトのプロファイルを設定します。Tools for Windows PowerShell を以前に使用した場合、この設定はすでに完了している可能性があります。AWS アカウントのルートユーザー ではなく、IAM ユーザーとしてサインインしている場合にのみ、ロールを切り替えることができます。

   ```
   PS C:\> Set-AWSCredentials -AccessKey AKIAIOSFODNN7EXAMPLE -SecretKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -StoreAs MyMainUserProfile
   PS C:\> Initialize-AWSDefaults -ProfileName MyMainUserProfile -Region us-east-2
   ```

   詳細については、[AWS ユーザーガイド](https://docs.aws.amazon.com/powershell/latest/userguide/specifying-your-aws-credentials.html)の「*AWS Tools for PowerShell 認証情報の指定*」を参照してください。

1. 新しいロールの認証情報を取得するには、以下のコマンドを実行して 123456789012 アカウントの `RoleName` ロールに切り替えます。ロール ARN は、ロールを作成したアカウント管理者から入手します。コマンドには、セッション名も指定する必要があります。その名前には任意のテキストを選択できます。以下のコマンドは、認証情報をリクエストした後、返されたオブジェクトから `Credentials` プロパティオブジェクトを取得して、`$Creds` 変数に格納します。

   ```
   PS C:\> $Creds = (Use-STSRole -RoleArn "arn:aws:iam::123456789012:role/RoleName" -RoleSessionName "MyRoleSessionName").Credentials
   ```

   `$Creds` オブジェクトにはこの時点で、以降の手順に必要な `AccessKeyId`、`SecretAccessKey`、`SessionToken` 要素が格納されています。以下のサンプルコマンドに示しているのは、一般的な値です。

   ```
   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. 以降のコマンドでこれらの認証情報を使用するには、`-Credential` パラメータに指定します。たとえば、以下のコマンドでロールの認証情報を使用すると、そのロールに `iam:ListRoles` アクセス許可が付与されている場合にのみ、`Get-IAMRoles` コマンドレットを実行できます。

   ```
           PS C:\> get-iamroles -Credential $Creds
   ```

1. 元の認証情報に戻すには、`-Credentials $Creds` パラメータの使用を止めるだけです。PowerShell ではデフォルトのプロファイルに保存された認証情報が再び使用されるようになります。

# IAM ロールを切り替える (AWS)
<a name="id_roles_use_switch-role-api"></a>

*ロール*は、AWS リソースへのアクセスに使用できる一連のアクセス許可を指定します。その点では、[IAM ユーザー](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)に似ています。ロールを引き受けることで、必要なタスクを実行したり、AWS リソースを操作したりするアクセス許可がプリンシパル (ユーザーまたはアプリケーション) に付与されます。ロールは、自身のアカウントのロールでも、他の AWS アカウント のロールでもかまいません。ロールとその利点、およびロールを作成して設定する方法については、「[IAM ロール](id_roles.md)」および「[IAM ロールの作成](id_roles_create.md)」を参照してください。ロールを引き受ける別の方法については、「[ロールを引き受けるための各種方法](id_roles_manage-assume.md)」を参照してください。

**重要**  
IAM ユーザーのアクセス許可および引き受けるロールは、累積されません。同時に有効になるアクセス権限のセットは 1 つのみです。ロールを引き受けると、以前のユーザーまたはロールのアクセス許可が一時的に無効になり、切り替え後のロールに割り当てられたアクセス許可が有効になります。そのロールを終了すると、自動的に元のアクセス許可が復元されます。

ロールを引き受けるため、アプリケーションは 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 オペレーションを呼び出して、使用するロールの ARN を渡します。このオペレーションでは、一時的な認証情報で新しいセッションを作成します。このセッションのアクセス許可は、そのロールのアイデンティティベースのポリシーと同じです。

[https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) を呼び出すと、必要に応じてインラインまたは管理[セッションポリシー](access_policies.md#policies_session)を渡すことができます。セッションポリシーは、ロールまたはフェデレーションユーザーのセッションに一時的な認証情報セッションをプログラムで作成する際、パラメータとして渡す高度なポリシーです。`Policy` パラメータを使用して単一の JSON インラインセッションポリシードキュメントを渡すことができます。`PolicyArns` パラメータを使用して、最大 10 個の管理セッションポリシーを指定できます。結果として得られるセッションのアクセス許可は、エンティティの ID ベースのポリシーとセッションポリシーの共通部分です。セッションポリシーは、ロールの一時的な認証情報を他のユーザーに提供する必要があるときに役立ちます。他のユーザーは、ロールの一時的な認証情報を以降の AWS API コールで使用し、ロールを所有するアカウント内のリソースにアクセスできます。セッションポリシーを使用して、ID ベースのポリシーで許可されているよりも多くのアクセス許可を付与することはできません。AWS でロールの有効なアクセス許可を決定する方法の詳細については、「[ポリシーの評価論理](reference_policies_evaluation-logic.md)」を参照してください。

![\[PermissionsWhenPassingRoles_Diagram\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/role_passed_policy_permissions.png)


IAM ユーザーまたはすでにロールを使用している[外部で認証されたユーザー](id_roles_providers.md) ([SAML](id_roles_providers_saml.md) または [OIDC](id_roles_providers_oidc.md)) としてサインインすると、`AssumeRole` を呼び出すことができます。ロールを使用して 2 つ目のロールを引き受ける、[*ロールの連鎖*](id_roles.md#iam-term-role-chaining)を使用することもできます。AWS アカウントのルートユーザー としてサインインしているときに、ロールを引き受けることはできません。

デフォルトでは、ロールセッションは 1 時間です。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 オペレーションを使用してこのロールを引き受ける場合は、`DurationSeconds` パラメータの値を指定できます。この値は 900 秒 (15 分) からロールの最大セッション期間設定までの範囲を指定できます。ロールの最大値を確認する方法については、「[ロールの最大セッション期間を更新する](id_roles_update-role-settings.md#id_roles_update-session-duration)」を参照してください。

ロールの連鎖を使用すると、セッションは最長である 1 時間に制限されます。この場合 `DurationSeconds` パラメータを使用して 1 時間より大きい値を指定すると、オペレーションは失敗します。

**注記**  
セキュリティ上の理由から、管理者は [AWS CloudTrail ログを確認](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)して、AWS でアクションを実行したユーザーを調べることができます。管理者は、ロールを引き受けるときに、ソース ID またはロールセッション名の指定を要求する場合があります。詳細については、「[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)」および「[`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname)」を参照してください。

次のコード例は、ユーザーを作成しロールを割り当てる方法を示しています。

**警告**  
セキュリティリスクを避けるため、専用ソフトウェアの開発や実際のデータを扱うときは、IAM ユーザーを認証に使用しないでください。代わりに、[AWS IAM アイデンティティセンター](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html) などの ID プロバイダーとのフェデレーションを使用してください。
+ 権限のないユーザーを作成します。
+ アカウントの Amazon S3 バケットを一覧表示する権限を付与するロールを作成します。
+ ユーザーがロールを引き受けられるようにポリシーを追加します。
+ ロールを引き受け、一時的な認証情報を使用して S3 バケットを一覧表示し、リソースをクリーンアップします。

------
#### [ .NET ]

**SDK for .NET**  
 GitHub には、その他のリソースもあります。[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();
    }
}
```
+ API の詳細については、「*AWS SDK for .NET API リファレンス*」の以下のトピックを参照してください。
  + [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 ]

**Bash スクリプトを使用した AWS CLI**  
 GitHub には、その他のリソースもあります。[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
}
```
このシナリオで使用される IAM 関数。  

```
###############################################################################
# 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
}
```
+ API の詳細については、「*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 for C\$1\$1**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[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;
}
```
+ API の詳細については、「*AWS SDK for C\$1\$1 API リファレンス*」の以下のトピックを参照してください。
  + [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 for Go V2**  
 GitHub には、その他のリソースもあります。[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/gov2/iam#code-examples)で完全な例を見つけて、設定と実行の方法を確認してください。
コマンドプロンプトからインタラクティブのシナリオを実行します。  

```
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)
}
```
アカウントアクションをラップする構造体を定義します。  

```
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
}
```
ポリシーアクションをラップする構造体を定義します。  

```
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
}
```
ロールアクションをラップする構造体を定義します。  

```
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
}
```
ユーザーアクションをラップする構造体を定義します。  

```
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
}
```
+ API の詳細については、「*AWS SDK for Go API リファレンス*」の以下のトピックを参照してください。
  + [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 for Java 2.x**  
 GitHub には、その他のリソースもあります。[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/iam#code-examples)で完全な例を見つけて、設定と実行の方法を確認してください。
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);
        }
    }
}
```
+ API の詳細については、「AWS SDK for Java 2.x API リファレンス**」の以下のトピックを参照してください。
  + [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 for JavaScript (v3)**  
 GitHub には、その他のリソースもあります。[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/iam#code-examples)で完全な例を見つけて、設定と実行の方法を確認してください。
IAM ユーザーと、Amazon S3 バケットを一覧表示するアクセス権限を付与するロールを作成します。ユーザーには、ロールの引き受けのみ権限があります。ロールを引き受けた後、一時的な認証情報を使用してアカウントのバケットを一覧表示します。  

```
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"));
};
```
+ API の詳細については、「*AWS SDK for JavaScript API リファレンス*」の以下のトピックを参照してください。
  + [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 for Kotlin**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/iam#code-examples)での設定と実行の方法を確認してください。
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)
}
```
+ API の詳細については、「*AWS SDK for Kotlin API リファレンス*」の以下のトピックを参照してください。
  + [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 for PHP**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[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";
```
+ API の詳細については、AWS SDK for PHP API リファレンスの**以下のトピックを参照してください。
  + [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 for Python (Boto3)**  
 GitHub には、その他のリソースもあります。[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/iam#code-examples)で完全な例を見つけて、設定と実行の方法を確認してください。
IAM ユーザーと、Amazon S3 バケットを一覧表示するアクセス権限を付与するロールを作成します。ユーザーには、ロールの引き受けのみ権限があります。ロールを引き受けた後、一時的な認証情報を使用してアカウントのバケットを一覧表示します。  

```
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()
```
+ API の詳細については、「*AWS SDK for Python (Boto3) API リファレンス*」の以下のトピックを参照してください。
  + [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 for Ruby**  
 GitHub には、その他のリソースもあります。[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby/example_code/iam#code-examples)で完全な例を見つけて、設定と実行の方法を確認してください。
IAM ユーザーと、Amazon S3 バケットを一覧表示するアクセス権限を付与するロールを作成します。ユーザーには、ロールの引き受けのみ権限があります。ロールを引き受けた後、一時的な認証情報を使用してアカウントのバケットを一覧表示します。  

```
# 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__
```
+ API の詳細については、AWS SDK for Ruby API リファレンスの**以下のトピックを参照してください。
  + [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**  
 GitHub には、その他のリソースもあります。[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(())
}
```
+ API の詳細については、「*AWS SDK for Rust API リファレンス*」の以下のトピックを参照してください。
  + [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)

------

# Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用してアクセス許可を付与する
<a name="id_roles_use_switch-role-ec2"></a>

Amazon EC2 インスタンスで実行されるアプリケーションはその AWS API リクエストに AWS 認証情報を含める必要があります。デベロッパーは Amazon EC2 インスタンス内に直接 AWS 認証情報を保存し、そのインスタンス内のアプリケーションに対してそれらの認証情報の使用を許可できます。しかし、デベロッパーは認証情報を管理し、その更新時には各インスタンスに安全に渡して、各 Amazon EC2 インスタンスを更新する必要があります。これは、かなりの追加作業です。

代わりに、IAM ロールを使用すると、Amazon EC2 インスタンスで実行されるアプリケーションに対して一時的な認証情報を管理するだけで済みます。ロールを使用する場合、長期認証情報 (サインイン認証情報、アクセスキーなど) を Amazon EC2 インスタンスに配布する必要はありません。代わりに、ロールは、アプリケーションが他の AWS リソースへの呼び出しを行うときに使用できる一時的なアクセス権限を提供します。Amazon EC2 インスタンスを起動するときに、そのインスタンスに関連付ける IAM ロールを指定します。そのインスタンスで実行されるアプリケーションは、そのロールから提供される一時的な認証情報を使用して API リクエストに署名できます。

ロールを使用して、Amazon EC2 インスタンスで実行されるアプリケーションに許可を付与するには、いくつかの追加設定が必要です。Amazon EC2 インスタンスで実行されるアプリケーションは、仮想化されたオペレーティングシステムによって AWS から抽象化されます。この追加の分離のため、AWS ロールとその関連付けられた許可を Amazon EC2 インスタンスに割り当て、アプリケーションに対してそれらの使用を許可するための追加の手順が必要になります。この別手順は、インスタンスにアタッチされる*[インスタンスプロファイル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)*の作成です。インスタンスプロファイルは、ロールを含んでおり、インスタンスで実行されるアプリケーションにロールの一時的な認証情報を提供できます。それらの一時的な認証情報は、アプリケーションの API コールで、リソースへのアクセスを許可するために、または、ロールで指定されたリソースのみにアクセスを制限するために使用できます。

**注記**  
同時に Amazon EC2 インスタンスに割り当てることができるのは 1 つのロールだけです。インスタンスのすべてのアプリケーションは、同じロールとアクセス許可を共有します。Amazon ECS を利用して Amazon EC2 インスタンスを管理する場合、Amazon ECS タスクが実行されている Amazon EC2 インスタンスのロールと区別できるロールを Amazon ECS タスクに割り当てることができます。各タスクにロールを割り当てることは、最小権限アクセスの原則に沿っており、アクションとリソースをよりきめ細かく制御できます。  
詳細については、Amazon Elastic Container Service ベストプラクティスガイドの「[Amazon ECS のタスクによる IAM ロールの使用](https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/security-iam-roles.html)」を参照してください。

この方法によるロールの使用には、いくつかの利点があります。ロールの認証情報は一時的なもので、自動的に更新されるため、開発者は認証情報を管理する必要がなく、長期のセキュリティリスクを心配する必要もありません。また、複数のインスタンスに 1 つのロールを使用する場合、その 1 つのロールに変更を加えるとその変更がすべてのインスタンスに自動的に反映されます。

**注記**  
ロールは通常、起動時に Amazon EC2 インスタンスに割り当てられますが、現在実行中の Amazon EC2 インスタンスにロールをアタッチすることもできます。実行中のインスタンスにロールをアタッチする方法については、「[Amazon EC2 の IAM ロール](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)」を参照してください。

**Topics**
+ [

## Amazon EC2 インスタンスのロールの仕組み
](#roles-usingrole-ec2instance-roles)
+ [

## Amazon EC2 でのロールの使用に必要なアクセス許可
](#roles-usingrole-ec2instance-permissions)
+ [

## 使用を開始するには
](#roles-usingrole-ec2instance-get-started)
+ [

## 関連情報
](#roles-usingrole-ec2instance-related-info)

## Amazon EC2 インスタンスのロールの仕組み
<a name="roles-usingrole-ec2instance-roles"></a>

以下の図では、デベロッパーは Amazon EC2 インスタンスでアプリケーションを実行しており、そのアプリケーションは `amzn-s3-demo-bucket-photos` という名前の S3 バケットにアクセスする必要があります。管理者は、`Get-pics` サービスロールを作成し、Amazon EC2 インスタンスにロールをアタッチします。ロールには、指定された S3 バケットへの読み取り専用アクセスを付与するアクセス許可ポリシーが含まれています。また、Amazon EC2 インスタンスがロールを引き受けて一時的な認証情報を取得することを許可する信頼ポリシーも含まれています。アプリケーションはインスタンスで実行されると、ロールの一時的な認証情報を使用して写真バケットにアクセスできます。管理者はデベロッパーに写真バケットにアクセスする権限を与える必要はなく、デベロッパーが認証情報を共有または管理する必要はありません。

![\[AWS リソースにアクセスする Amazon EC2 インスタンス上のアプリケーション\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/roles-usingrole-ec2roleinstance.png)


1. 管理者は、**Get-pics** ロールの作成に IAM を使用します。ロールの信頼ポリシーでは、Amazon EC2 インスタンスのみがロールを引き受けることができることを指定します。ロールのアクセス許可ポリシーでは、`amzn-s3-demo-bucket-photos` バケットに対する読み取り専用アクセス許可を指定します。

1. デベロッパーは Amazon EC2 インスタンスを起動し、`Get-pics` ロールをそのインスタンスに割り当てます。
**注記**  
IAM コンソールを使用する場合、インスタンスプロファイルは自動的に管理され、ほとんど透過的です。ただし、AWS CLI または API を使用してロールと Amazon EC2 インスタンスを作成および管理する場合、インスタンスプロファイルを作成し、別の手順でそのプロファイルにロールを割り当てる必要があります。次に、インスタンスを起動するときに、ロール名ではなくインスタンスのプロファイル名を指定する必要があります。

1. 「[インスタンスメタデータからのセキュリティ認証情報の取得](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)」で説明されているように、アプリケーションは実行時に Amazon EC2 [インスタンスメタデータ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials)からセキュリティ認証情報を取得します。これらは、ロールを表す[一時的セキュリティ認証情報](id_credentials_temp.md)で、制限された期間の間有効です 

   一部の [AWS SDK](https://aws.amazon.com/tools/) では、デベロッパーは、一時的なセキュリティ認証情報を透過的に管理するプロバイダーを使用できます (認証情報を管理するためにその SDK によってサポートされている機能については、各 AWS SDK のドキュメントを参照してください。)

   あるいは、アプリケーションは Amazon EC2 インスタンスのインスタンスメタデータから一時的な認証情報を直接取得することもできます。認証情報とその関連する値はメタデータの `iam/security-credentials/role-name` カテゴリ (この場合は `iam/security-credentials/Get-pics`) から入手できます。アプリケーションがインスタンスメタデータから認証情報を取得する場合、アプリケーションは認証情報をキャッシュすることができます。

1. 取得された一時的な認証情報を使用して、アプリケーションは写真バケットにアクセスします。**Get-pics** ロールにアタッチされたポリシーのために、アプリケーションには読み取り専用のアクセス許可があります。

   インスタンスで使用可能な一時的な認証情報は、失効前に自動的に更新されるため、有効な認証情報のセットを常に使用できます。アプリケーションは、現在の認証情報セットが失効する前に、インスタンスメタデータから新しい認証情報セットを取得するだけで済みます。AWS SDK を使用して認証情報を管理できるため、認証情報を更新するための追加のロジックをアプリケーションに含める必要がありません。たとえば、インスタンスプロファイル認証情報プロバイダーを使用してクライアントをインスタンス化します。ただし、アプリケーションがインスタンスメタデータから一時的な認証情報を取得してキャッシュしている場合、1 時間おき、または少なくとも現在のセットが失効する 15 分前までに、更新された認証情報セットを取得する必要があります。失効時刻は、`iam/security-credentials/role-name` カテゴリに返された情報に含まれます。

## Amazon EC2 でのロールの使用に必要なアクセス許可
<a name="roles-usingrole-ec2instance-permissions"></a>

ロールを割り当てたインスタンスを起動するために、デベロッパーには Amazon EC2 インスタンスを起動する許可と IAM ロールを割り当てる許可が必要です。

以下のポリシーサンプルは、ロールを使用してインスタンスを起動させるために、ユーザーに AWS マネジメントコンソール を使用することを許可します。ポリシーにアスタリスク (`*`) を含めることで、任意のロールの割り当てとリストにある Amazon EC2 アクションの実行をユーザーに許可します。`ListInstanceProfiles` アクションでは、AWS アカウント で使用できるすべてのロールの表示をユーザーに許可します。

**Example 任意のロールが割り当てられたインスタンスを Amazon EC2 コンソールで起動するアクセス許可をユーザーに付与するポリシーの例**    
****  

```
{
    "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": "*"
        }
    ]
}
```

### Amazon EC2 インスタンスに割り当て可能なロールを制限する (PassRole を使用)
<a name="roles-usingrole-ec2instance-passrole"></a>

`PassRole` 許可を使用すると、インスタンスの起動時にユーザーが Amazon EC2 インスタンスに割り当てることのできるロールを制限できます。これにより、ユーザーに付与されているアクセス許可よりも多くのアクセス許可を持つアプリケーションをユーザーが実行することを回避できます。つまり、ユーザーは、昇格されたアクセス許可を取得することができなくなります。例えば、ユーザー Alice には、Amazon EC2 インスタンスを起動し Amazon S3 バケットを操作する許可のみがあるが、このユーザーが Amazon EC2 インスタンスに割り当てるロールには、IAM と Amazon DynamoDB を操作する許可があるとします。その場合、Alice はインスタンスを起動してログインし、一時的セキュリティ認証情報を取得して、彼女にはアクセス許可がない IAM または DynamoDB アクションを実行できます。

ユーザーが Amazon EC2 インスタンスに割り当てることのできるロールを制限するには、`PassRole` アクションを許可するポリシーを作成します。その後、Amazon EC2 インスタンスを起動するユーザー (またはそのユーザーが属する IAM グループ) にそのポリシーをアタッチします。ポリシーの `Resource` の要素に、ユーザーが Amazon EC2 インスタンスに渡すことを許可するロールを記載します。ユーザーがインスタンスを起動し、そのインスタンスにロールを割り当てるとき、Amazon EC2 は、ユーザーがそのロールの割り当てを許可されているかどうかを確認します。もちろん、ユーザーが割り当てることのできるロールに想定外のアクセス権限が含まれていないことを確認する必要があります。

**注記**  
`PassRole` は、`RunInstances` や `ListInstanceProfiles` とは異なり、API アクションではありません。それは API にロールの ARN がパラメータとして渡されるときに、必ず AWS が確認を行う許可です (またはユーザーの代わりにコンソールがこれを行います)。これにより管理者は、渡すことができるロールと、そのロールを渡すことができるユーザーを制御するのに役立ちます。この場合では、ユーザーが特定のロールを Amazon EC2 インスタンスにアタッチできるようにします。

**Example 特定のロールが割り当てられた Amazon EC2 インスタンスを起動する許可をユーザーに付与するポリシーの例**  
以下のポリシーサンプルは、ロールを使用してインスタンスを起動するために、ユーザーに Amazon EC2 API の使用を許可します。`Resource` 要素は、ロールの Amazon リソースネーム (ARN) を指定します。ポリシーで ARN を指定することで、`Get-pics` ロールのみを割り当てるアクセス許可をユーザーに付与します。インスタンスの起動時にユーザーが異なるロールを指定した場合、アクションは失敗します。ユーザーには、ロールを渡したかどうかにかかわらず、すべてのインスタンスを実行する権限があります。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/Get-pics"
        }
    ]
}
```

### インスタンスプロファイルロールが他のアカウントのロールへの切り替えることを許可する
<a name="switch-role-ec2-another-account"></a>

Amazon EC2 インスタンスで実行されているアプリケーションが別のアカウントでコマンドを実行することを許可できます。これを行うには、最初のアカウントの Amazon EC2 インスタンスロールを 2 番目のアカウントのロールに切り替えることを許可する必要があります。

2 つの AWS アカウント を使用していて Amazon EC2 インスタンスで実行されているアプリケーションが両方のアカウントで [AWS CLI](https://aws.amazon.com/cli/) コマンドを実行できるようにするとします。アカウント `111111111111` に Amazon EC2 インスタンスが存在すると仮定します。このインスタンスには、同じ `abcd` アカウント内の `amzn-s3-demo-bucket1` バケットで読み取り専用の `111111111111` タスクをアプリケーションが実行する Amazon S3 インスタンスプロファイルのロールが含まれています。ただし、アプリケーションは、アカウント `amzn-s3-demo-bucket2` の `efgh` Amazon S3 バケットにアクセスするために `222222222222` クロスアカウントロールを引き受けることも許可されている必要があります。

![\[この図は、デベロッパーがロールを使用して Amazon EC2 インスタンスを起動し、Amazon S3 バケット内の写真へのアクセスを取得する方法を示しています。\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/roles-instance-profile-cross-account.png)


アプリケーションが `amzn-s3-demo-bucket1` Amazon S3 バケットにアクセスできるようにするには、`abcd` Amazon EC2 インスタンスプロファイルロールは次のアクセス許可ポリシーを持っている必要があります。

***アカウント 111111111111 `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"
        }
    ]
}
```

------

この `abcd` ロールは、ロールを引き受ける上で Amazon EC2 サービスを信頼する必要があります。これを行うには、`abcd` ロールは次の信頼ポリシーを持っている必要があります。

***アカウント 111111111111 `abcd`ロールの信頼ポリシー***

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

****  

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

------

`efgh` クロスアカウントのロールが、同じ `amzn-s3-demo-bucket2` アカウント内の`222222222222` バケットで読み取り専用 Amazon S3 タスクを許可すると仮定します。これを行うには、`efgh` クロスアカウントのロールは、以下のアクセス許可ポリシーを持っている必要があります。

***アカウント 222222222222 `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"
            ]
        }
    ]
}
```

------

`efgh` ロールは `abcd` インスタンスプロファイルのロールがそれを引き受けることを信頼する必要があります。これを行うには、`efgh` ロールは次の信頼ポリシーを持っている必要があります。

***アカウント 222222222222 `efgh` ロールの信頼ポリシー***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "efghTrustPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"}
        }
    ]
}
```

------

## 使用を開始するには
<a name="roles-usingrole-ec2instance-get-started"></a>

Amazon EC2 インスタンスでロールがどのように機能するかを理解するには、IAM コンソールでロールを作成し、そのロールが割り当てられた Amazon EC2 インスタンスを起動して、実行中のインスタンスを調べる必要があります。[インスタンスのメタデータ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)を調べて、ロールの一時的な認証情報がインスタンスでどのようにして使用可能になったかを確認できます。また、インスタンスで実行されるアプリケーションがそのロールをどのように使用できるかも確認できます。詳細については、以下のリソースを参照してください。
+ [IAM Roles on Amazon EC2 Instances Tutorial](https://www.youtube.com/watch?v=TlCuOjviOhk) (Amazon EC2 インスタンスでの IAM ロールのチュートリアル)。リンクされている動画では、IAM ロールを Amazon EC2 インスタンスに割り当てて、インスタンスでのアプリケーション実行時に行える操作を制御する方法について説明します。この動画は、アプリケーション (AWS SDK で記述) がロールから一時的セキュリティ認証情報を取得する仕組みについて説明しています。
+ SDK ウォークスルー。AWS SDK ドキュメント内のこれらのチュートリアルでは、Amazon EC2 インスタンスで実行されるアプリケーションがロールの一時的な認証情報を使用して Amazon S3 バケットを読み取る手順について説明しています。以下の各ウォークスルーでは、別のプログラミング言語での同様の手順について説明しています。
  + [AWS SDK for Java デベロッパーガイド](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html)の*Java 用 SDK を使用した Amazon EC2 の IAM ロールの設定* 
  + 「AWS SDK for .NET デベロッパーガイド」の「[Launch an Amazon EC2 Instance using the SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/run-instance.html)」
  + *AWS SDK for Ruby デベロッパーガイド*の[Ruby 用の SDK for Ruby を使用した Amazon EC2 インスタンスの作成](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/ec2-example-create-instance.html)

## 関連情報
<a name="roles-usingrole-ec2instance-related-info"></a>

ロールの作成または Amazon EC2 インスタンスのロールに関する詳細については、次の情報を参照してください。
+ [Amazon EC2 インスタンスでの IAM ロールの使用](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)の詳細については、「Amazon EC2 ユーザーガイド」を参照してください。
+ ロールの作成については、「[IAM ロールの作成](id_roles_create.md)」を参照してください。
+ 一時的なセキュリティ認証情報の使用方法の詳細については、「[IAM の一時的な認証情報](id_credentials_temp.md)」を参照してください。
+ IAM API または CLI で作業する場合、IAM インスタンスプロファイルを作成および管理する必要があります。インスタンスプロファイルの詳細については、「[インスタンスプロファイルを使用する](id_roles_use_switch-role-ec2_instance-profiles.md)」を参照してください。
+ インスタンスメタデータにあるロールの一時的なセキュリティ認証情報に関する詳細については、「Amazon EC2 ユーザーガイド」の「[インスタンスメタデータからのセキュリティ認証情報の取得](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials)」を参照してください。

# インスタンスプロファイルを使用する
<a name="id_roles_use_switch-role-ec2_instance-profiles"></a>

インスタンスプロファイルを使用して、IAM ロールを EC2 インスタンスに渡します。詳細については、[Amazon EC2 ユーザーガイド](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) の「*Amazon EC2 の IAM ロール*」を参照してください。

## インスタンスプロファイルの管理 (コンソール)
<a name="instance-profiles-manage-console"></a>

AWS マネジメントコンソール を使用して Amazon EC2 のロールを作成する場合、コンソールはインスタンスプロファイルを自動的に作成し、そのインスタンスプロファイルにロールと同じ名前を付けます。IAM ロールを使用してインスタンスを起動するのに Amazon EC2 コンソールを使用する場合、インスタンスに関連付けるロールを選択できます。コンソールに表示されるリストは実際にはインスタンスプロファイル名のリストです。コンソールでは、Amazon EC2 に関連付けられていないロールのインスタンスプロファイルは作成されません。

ロールとインスタンスプロファイルの名前が同じである場合は、AWS マネジメントコンソール を使用して Amazon EC2 の IAM ロールとインスタンスプロファイルを削除できます。インスタンスプロファイルの削除の詳細については、「[ロールまたはインスタンスプロファイルを削除する](id_roles_manage_delete.md)」を参照してください。

**注記**  
インスタンスのアクセス許可を更新するには、インスタンスプロファイルを置き換えます。この変更が有効になるまでに最大 1 時間の遅延が発生するため、インスタンスプロファイルからロールを削除することはお勧めしません。

## インスタンスプロファイルの管理 (AWS CLI または AWS API)
<a name="instance-profiles-manage-cli-api"></a>

AWS CLI または AWS API からロールを管理する場合、ロールとインスタンスプロファイルを別個のアクションとして作成します。ロールとインスタンスプロファイルには異なる名前を使用できるため、インスタンスプロファイルの名前とこれらのプロファイルに含まれるロールの名前を知っている必要があります。これにより、EC2 インスタンスを起動するときに適切なインスタンスプロファイルを選択できます。

IAM リソース (インスタンスプロファイルを含む) にタグをアタッチして、それらへのアクセスを特定、整理、制御することができます。インスタンスプロファイルにタグを付けることができるのは、AWS CLI または AWS API を使用する場合のみです。

**注記**  
インスタンスプロファイルに含めることができる IAM ロールは 1 つのみです。ただし、1 つのロールを複数のインスタンスプロファイルに含めることはできます。このインスタンスプロファイルあたり 1 ロールの制限は、緩和できません。既存のロールを削除してから、別のロールをインスタンスプロファイルに追加することはできます。その後、AWS 全体で変更が反映されるのを待つ必要があります。これは[結果整合性](https://en.wikipedia.org/wiki/Eventual_consistency)のためです。変更を強制的に実行するには、[インスタンスプロファイル](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html)の関連付けを解除してから、[インスタンスプロファイルを関連付ける](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html)か、インスタンスを停止してから再起動します。

### インスタンスプロファイルの管理 (AWS CLI)
<a name="instance-profiles-manage-cli"></a>

AWS アカウントでインスタンスプロファイルを使用するには、以下の AWS CLI コマンドを使用できます。
+ インスタンスプロファイルを作成する: [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)
+ インスタンスプロファイルにタグを付ける: [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)
+ インスタンスプロファイルのタグを一覧表示する: [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)
+ インスタンスプロファイルのタグを解除する: [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)
+ ロールをインスタンスプロファイルに追加する: [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) 
+ インスタンスプロファイルのリストを取得する: [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)
+ インスタンスプロファイルの情報を取得する: [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) 
+ ロールをインスタンスプロファイルから削除する: [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)
+ インスタンスプロファイルを削除する: [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) 

次のコマンドを使用して、既に実行中の EC2 インスタンスにロールをアタッチすることもできます。詳細については、「[Amazon EC2 の IAM ロール](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)」を参照してください。
+ ロールが含まれたインスタンスプロファイルを停止中または実行中の EC2 インスタンスにアタッチする: [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) 
+ 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) 
+ ロールが含まれたインスタンスプロファイルを停止中または実行中の EC2 インスタンスからデタッチする: [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) 

### インスタンスプロファイルの管理 (AWS API)
<a name="instance-profiles-manage-api"></a>

以下の AWS API オペレーションを呼び出して AWS アカウント のインスタンスプロファイルを使用できます。
+ インスタンスプロファイルを作成する: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html) 
+ インスタンスプロファイルにタグを付ける: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html) 
+ インスタンスプロファイルのタグを一覧表示する: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html) 
+ インスタンスプロファイルのタグを解除する: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html) 
+ ロールをインスタンスプロファイルに追加する: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddRoleToInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddRoleToInstanceProfile.html) 
+ インスタンスプロファイルのリストを取得する: [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)
+ インスタンスプロファイルの情報を取得する: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetInstanceProfile.html) 
+ ロールをインスタンスプロファイルから削除する: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html) 
+ インスタンスプロファイルを削除する: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html) 

以下のオペレーションを呼び出して、既に実行中の EC2 インスタンスにロールをアタッチすることもできます。詳細については、「[Amazon EC2 の IAM ロール](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)」を参照してください。
+ ロールが含まれたインスタンスプロファイルを停止中または実行中の EC2 インスタンスにアタッチする: [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html) 
+ EC2 インスタンスにアタッチされたインスタンスプロファイルに関する情報を取得する: [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIamInstanceProfileAssociations.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIamInstanceProfileAssociations.html) 
+ ロールが含まれたインスタンスプロファイルを停止中または実行中の EC2 インスタンスからデタッチする: [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html) 