翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
サービスアカウントの 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-serviceaccounts
は roleOnly
/--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-manager
、 cluster-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>