

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# サービスアカウントの AWS Security Token Service エンドポイントを設定する
<a name="configure-sts-endpoint"></a>

Kubernetes サービスアカウントを[サービスアカウント用の IAM ロール](iam-roles-for-service-accounts.md)と共に使用している場合、そのサービスアカウントで使用される AWS Security Token Service エンドポイントのタイプを設定できます。

 AWS では、グローバルエンドポイントの代わりに地域の AWS STS エンドポイントを使用することを推奨しています。これにより、レイテンシーが減少し、組み込みの冗長性が提供され、セッショントークンの有効性が向上します。Pod が実行中の AWS リージョンで、AWS Security Token Service がアクティブであること。さらに、AWS リージョン内のサービスに障害が発生した場合に別の AWS リージョンを使用できるよう、アプリケーションに冗長性が組み込まれている必要があります。詳細については、IAM ユーザーガイドの「[AWS リージョンでの AWS STS の管理](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)」を参照してください。
+ 既存のクラスター。まだ所有していない場合は、[Amazon EKS の使用を開始する](getting-started.md) でのガイドのいずれかを参照しながら作成できます。
+ クラスター用の既存の IAM OIDC プロバイダー。詳細については、「[クラスターの IAM OIDC プロバイダーを作成するには](enable-iam-roles-for-service-accounts.md)」を参照してください。
+ [サービスアカウント用の Amazon EKS IAM](iam-roles-for-service-accounts.md) 機能を使用するように設定された、既存の Kubernetes サービスアカウント。

次の例ではすべて、[Amazon VPC CNI プラグイン](cni-iam-role.md)で使用される aws-node Kubernetes サービスアカウントを使用しています。{{example values}} は、ご自身のサービスアカウント、ポッド、名前空間、その他のリソースに置き換えることができます。

1. エンドポイントを変更したいサービスアカウントを使用する Pod を選択します。Pod を実行する AWS リージョンを決定します。{{aws-node-6mfgv}} を Pod 名に置き換え、{{kube-system}} をポッドの名前空間に置き換えます。

   ```
   kubectl describe pod aws-node-6mfgv -n kube-system |grep Node:
   ```

   出力例は次のとおりです。

   ```
   ip-192-168-79-166.us-west-2/192.168.79.166
   ```

   前の出力では、Pod は us-west-2 AWS リージョンのノードで実行されています。

1. Pod のサービスアカウントが使用しているエンドポイントタイプを確認します。

   ```
   kubectl describe pod aws-node-6mfgv -n kube-system |grep AWS_STS_REGIONAL_ENDPOINTS
   ```

   出力例は次のとおりです。

   ```
   AWS_STS_REGIONAL_ENDPOINTS: regional
   ```

   現在のエンドポイントがグローバルの場合、この出力には `global` が返されます。出力が返されない場合、デフォルトのエンドポイントタイプが、上書きされないまま使用されています。

1. クラスターまたはプラットフォームのバージョンが表に示されているバージョンと同じかそれ以降の場合は、次のコマンドのいずれかを使用して、サービスアカウントで使用されるエンドポイントタイプをデフォルトタイプから別のタイプに変更できます。{{aws-node}} は、サービスアカウントの名前に置き換え、{{kube-system}} は、サービスアカウントの名前空間に置き換えます。
   + デフォルトまたは現在のエンドポイントタイプがグローバルであり、それをリージョン別に変更する場合は、以下の手順を実行します。

     ```
     kubectl annotate serviceaccount -n kube-system aws-node eks.amazonaws.com/sts-regional-endpoints=true
     ```

     Pod のコンテナで実行されているアプリケーションで、事前署名された S3 URL を生成するために[サービスアカウントの IAM ロール](iam-roles-for-service-accounts.md)を使用している場合、リージョン別エンドポイントの URL の形式は、次の例のようになります。

     ```
     https://bucket.s3.us-west-2.amazonaws.com/path?...&X-Amz-Credential=your-access-key-id/date/us-west-2/s3/aws4_request&...
     ```
   + デフォルトまたは現在のエンドポイントタイプがリージョン別であり、それをグローバルに変更する場合は、次の手順を実行します。

     ```
     kubectl annotate serviceaccount -n kube-system aws-node eks.amazonaws.com/sts-regional-endpoints=false
     ```

     アプリケーションが、AWS STS のグローバルエンドポイントに対し明示的にリクエストを行っており、Amazon EKS クラスターにおいて、リージョン別エンドポイントを使用する際のデフォルトの動作がオーバーライドされていない場合は、リクエストが失敗しエラーが返されます。詳細については、「[ポッドコンテナは次のエラーを受け取ります: `An error occurred (SignatureDoesNotMatch) when calling the GetCallerIdentity operation: Credential should be scoped to a valid region`](security-iam-troubleshoot.md#security-iam-troubleshoot-wrong-sts-endpoint)」を参照してください。

     Pod のコンテナで実行されているアプリケーションで、事前署名された S3 URL を生成するために[サービスアカウントの IAM ロール](iam-roles-for-service-accounts.md)を使用している場合、グローバルエンドポイントの URL の形式は、次の例のようになります。

     ```
     https://bucket.s3.amazonaws.com/path?...&X-Amz-Credential=your-access-key-id/date/us-west-2/s3/aws4_request&...
     ```

   使用している自動化処理で、事前署名付き URL に特定の形式を想定している場合、または事前署名付き URL を使用するアプリケーションやダウンストリームの依存関係に、ターゲットとして想定する AWS リージョンがある場合、適切な AWS STS エンドポイントを使用するために必要な変更を加えます。

1. 認証情報環境変数を適用するために、サービスアカウントに関連付けられている既存の Pod を削除して再作成します。変更するウェブフックは、既に実行されている Pod には適用されません {{Pod}}、{{kube-system}}、および {{-l k8s-app=aws-node}} を、アノテーションを設定する Pod の情報に置き換えることができます。

   ```
   kubectl delete Pods -n kube-system -l k8s-app=aws-node
   ```

1. Pod がすべて再起動したことを確認します。

   ```
   kubectl get Pods -n kube-system -l k8s-app=aws-node
   ```

1. Pod のいずれかの環境変数を表示します。`AWS_STS_REGIONAL_ENDPOINTS` の値が、以前のステップで設定した値であることを確認します。

   ```
   kubectl describe pod aws-node-kzbtr -n kube-system |grep AWS_STS_REGIONAL_ENDPOINTS
   ```

   出力例は次のとおりです。

   ```
   AWS_STS_REGIONAL_ENDPOINTS=regional
   ```