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

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

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

Kubernetes バージョン プラットフォームバージョン デフォルトのエンドポイントタイプ
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 の管理」を参照してください。

前提条件
Kubernetes サービスアカウントで使用するエンドポイントタイプを設定するには

以下に示す例ではすべて、Amazon VPC CNI プラグイン で使用される aws-node Kubernetes サービスアカウントを使用しています。example values は、ユーザー独自のサービスアカウント、Pods、名前空間、およびその他のリソースに置き換えることができます。

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

    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

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

      Pods のコンテナで実行されているアプリケーションで、事前署名された S3 URL を生成するために サービスアカウントの 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