サービスアカウントの IAM ロール - Eksctl ユーザーガイド

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

サービスアカウントの IAM ロール

ヒント

eksctl は、EKS Pod Identity Associations を介してアプリケーションを実行する EKS へのきめ細かなアクセス許可の設定をサポートします。

Amazon EKS は、ここでサービスアカウントのロール (IRSA)] をサポートしています。これにより、クラスターオペレーターは AWS IAM ロールを Kubernetes サービスアカウントにマッピングできます。

これにより、EKS で実行され、他の AWS のサービスを使用するアプリケーションのアクセス許可をきめ細かく管理できます。これらは、S3、その他のデータサービス (RDS、MQ、STS、DynamoDB)、または AWS Load Balancer コントローラーや ExternalDNS などの Kubernetes コンポーネントを使用するアプリケーションです。

を使用して IAM ロールとサービスアカウントのペアを簡単に作成できますeksctl

注記

インスタンスロールを使用していて、代わりに IRSA の使用を検討している場合は、この 2 つを混在させるべきではありません。

仕組み

EKS が公開する IAM OpenID Connect プロバイダー (OIDC) を介して動作し、IAM ロールは IAM OIDC プロバイダー (特定の EKS クラスターに固有) を参照し、バインドされる Kubernetes サービスアカウントを参照して構築する必要があります。IAM ロールが作成されると、サービスアカウントはそのロールの ARN を注釈 () として含める必要がありますeks.amazonaws.com/role-arn。デフォルトでは、サービスアカウントはロール注釈を含めるように作成または更新されます。これは、 フラグ を使用して無効にできます--role-only

EKS 内には、ポッドが使用するサービスアカウントの注釈に基づいて、AWS セッション認証情報をそれぞれロールのポッドに挿入するアドミッションコントローラーがあります。認証情報は AWS_ROLE_ARN & AWS_WEB_IDENTITY_TOKEN_FILE環境変数によって公開されます。最新バージョンの AWS SDK が使用されている場合 (正確なバージョンの詳細については、こちらを参照)、アプリケーションはこれらの認証情報を使用します。

リソースeksctlの名前は iamserviceaccount で、IAM ロールとサービスアカウントのペアを表します。

CLI の使用

注記

サービスアカウントの IAM ロールには、Kubernetes バージョン 1.13 以降が必要です。

IAM OIDC プロバイダーはデフォルトでは有効になっていません。次のコマンドを使用して有効にすることも、設定ファイル (以下を参照) を使用することもできます。

eksctl utils associate-iam-oidc-provider --cluster=<clusterName>

クラスターに IAM OIDC プロバイダーを関連付けたら、サービスアカウントにバインドされた IAM ロールを作成するには、以下を実行します。

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --namespace=<serviceAccountNamespace> --attach-policy-arn=<policyARN>
注記

複数のポリシーを使用するには、--attach-policy-arn複数回指定できます。

具体的には、以下を実行して、S3 への読み取り専用アクセス権を持つサービスアカウントを作成できます。

eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

デフォルトでは、default名前空間に作成されますが、次のような他の名前空間を指定できます。

eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --namespace=s3-app --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
注記

名前空間がまだ存在しない場合は、作成されます。

サービスアカウントが (IAM ロールなしで) クラスターに既に作成されている場合は、 --override-existing-serviceaccountsフラグを使用する必要があります。

カスタムタグ付けは、 を指定して IAM ロールに適用することもできます--tags

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --tags "Owner=John Doe,Team=Some Team"

CloudFormation は、ランダムな文字列を含むロール名を生成します。事前定義されたロール名が必要な場合は、 を指定できます--role-name

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-name "custom-role-name"

サービスアカウントが helm などの他のツールによって作成および管理されている場合は、 を使用して競合を防止--role-onlyします。もう 1 つのツールは、ロール ARN 注釈の維持を担当します。--override-existing-serviceaccountsroleOnly/--role-only サービスアカウントには影響せず、ロールは常に作成されます。

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-only --role-name=<customRoleName>

サービスアカウントで使用する既存のロールがある場合は、ポリシーを指定する代わりに --attach-role-arnフラグを指定できます。ロールが指定されたサービスアカウントでのみ引き受けられるようにするには、ここで関係ポリシードキュメントを設定する必要があります〕。

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --attach-role-arn=<customRoleARN>

サービスアカウントロールのアクセス許可を更新するには、 を実行しますeksctl update iamserviceaccount

注記

eksctl delete iamserviceaccount は、 によって作成されていない場合ServiceAccountsでも Kubernetes を削除しますeksctl

設定ファイルでの使用

設定ファイルiamserviceaccountsを使用して を管理するには、 で必要なアカウントを設定iam.withOIDC: trueして一覧表示しますiam.serviceAccount

すべてのコマンドは をサポートしており--config-fileノードグループと同じ方法で iamservice アカウントを管理できます。eksctl create iamserviceaccount コマンドは --include--excludeフラグをサポートします (これらの仕組みの詳細については、このセクションを参照してください)。また、 eksctl delete iamserviceaccount コマンドは --only-missingもサポートしているため、ノードグループと同じ方法で削除を実行できます。

注記

IAM サービスアカウントは名前空間内でスコープされます。つまり、同じ名前の 2 つのサービスアカウントが別の名前空間に存在する可能性があります。したがって、サービスアカウントを --include--excludeフラグの一部として一意に定義するには、 namespace/name形式で名前文字列を渡す必要があります。例:

eksctl create iamserviceaccount --config-file=<path> --include backend-apps/s3-reader

を有効にするオプションwellKnownPoliciesは、ポリシーのリストの省略としてcert-managercluster-autoscalerや などのよく知られたユースケースで IRSA を使用する場合に含まれています。

サポートされている既知のポリシーやその他のプロパティserviceAccounts、設定スキーマに記載されています。

では、次の設定例を使用しますeksctl create cluster

# An example of ClusterConfig with IAMServiceAccounts: --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: cluster-13 region: us-west-2 iam: withOIDC: true serviceAccounts: - metadata: name: s3-reader # if no namespace is set, "default" will be used; # the namespace will be created if it doesn't exist already namespace: backend-apps labels: {aws-usage: "application"} attachPolicyARNs: - "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess" tags: Owner: "John Doe" Team: "Some Team" - metadata: name: cache-access namespace: backend-apps labels: {aws-usage: "application"} attachPolicyARNs: - "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess" - "arn:aws:iam::aws:policy/AmazonElastiCacheFullAccess" - metadata: name: cluster-autoscaler namespace: kube-system labels: {aws-usage: "cluster-ops"} wellKnownPolicies: autoScaler: true roleName: eksctl-cluster-autoscaler-role roleOnly: true - metadata: name: some-app namespace: default attachRoleARN: arn:aws:iam::123:role/already-created-role-for-app nodeGroups: - name: "ng-1" tags: # EC2 tags required for cluster-autoscaler auto-discovery k8s.io/cluster-autoscaler/enabled: "true" k8s.io/cluster-autoscaler/cluster-13: "owned" desiredCapacity: 1

これらのフィールドを設定せずにクラスターを作成する場合は、次のコマンドを使用して必要なものをすべて有効にできます。

eksctl utils associate-iam-oidc-provider --config-file=<path> eksctl create iamserviceaccount --config-file=<path>

詳細情報