サービスアカウントの AWS Security Token Service エンドポイントを設定する - Amazon EKS

サービスアカウントの AWS Security Token Service エンドポイントを設定する

サービスアカウントの IAM ロールIAM ロールで Kubernetes サービスアカウントを使用している場合、クラスターとプラットフォームバージョンが同じであるか、次の表にリストされているものより後であれば、サービスアカウントで使用される AWS Security Token Service エンドポイントのタイプを設定できます。Kubernetes またはプラットフォームのバージョンが表に記載されているバージョンよりも前の場合、サービスアカウントはグローバルエンドポイントのみを使用できます。

Kubernetes バージョン プラットフォームバージョン デフォルトのエンドポイントタイプ

1.31

eks.4

リージョン別

1.30

eks.2

リージョン別

1.29

eks.1

リージョン別

1.28

eks.1

リージョン別

1.27

eks.1

リージョン別

1.26

eks.1

リージョン別

1.25

eks.1

リージョン別

1.24

eks.2

リージョン別

1.23

eks.1

リージョン別

AWS では、グローバルエンドポイントの代わりに地域の AWS STS エンドポイントを使用することを推奨しています。これにより、レイテンシーが減少し、組み込みの冗長性が提供され、セッショントークンの有効性が向上します。Pod が実行中の AWS リージョンで、AWS Security Token Service がアクティブであること。さらに、AWS リージョン内のサービスに障害が発生した場合に別の AWS リージョンを使用できるよう、アプリケーションに冗長性が組み込まれている必要があります。詳細については、IAM ユーザーガイドの「AWS リージョンでの AWS STS の管理」を参照してください。

次の例ではすべて、IRSA を使用するように Amazon VPC CNI プラグインを設定するAmazon VPC CNI プラグイン で使用される aws-node Kubernetes サービスアカウントを使用しています。サンプル値は、ご自身のサービスアカウント、Pods、名前空間、その他のリソースに置き換えることができます。

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

    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 リージョンのノードで実行されています。

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

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

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

    AWS_STS_REGIONAL_ENDPOINTS: regional

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

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

    • デフォルトまたは現在のエンドポイントタイプがグローバルであり、それをリージョン別に変更する場合は、以下の手順を実行します。

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

      ポッドのコンテナで実行されているアプリケーションで、事前署名された S3 URL を生成するために サービスアカウントの IAM ロールIAM ロールを使用している場合、リージョン別エンドポイントの 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」を参照してください。

      ポッドのコンテナで実行されているアプリケーションで、事前署名された S3 URL を生成するために サービスアカウントの IAM ロールIAM ロールを使用している場合、グローバルエンドポイントの 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 エンドポイントを使用するために必要な変更を加えます。

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

    kubectl delete Pods -n kube-system -l k8s-app=aws-node
  5. Pods がすべて再起動したことを確認します。

    kubectl get Pods -n kube-system -l k8s-app=aws-node
  6. Pods のいずれかの環境変数を表示します。AWS_STS_REGIONAL_ENDPOINTS の値が、以前のステップで設定した値であることを確認します。

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

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

    AWS_STS_REGIONAL_ENDPOINTS=regional