You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CDK复现eksctl create iamserviceaccount配置External Secrets Operator

问题描述

我尝试用CDK配置External Secrets Operator,对应AWS指南中的eksctl create iamserviceaccount步骤时遇到问题。指南中创建的blogdemosa角色信任关系如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<account_id>:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/<cluster_oidc_id>"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "oidc.eks.us-east-1.amazonaws.com/id/<cluster_oidc_id>:sub": "system:serviceaccount:default:blogdemosa",
                    "oidc.eks.us-east-1.amazonaws.com/id/<cluster_oidc_id>:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

我写出了大致的CDK代码,但不知道FederatedPrincipal的参数该如何填写:

const serviceAccountRole = new iam.Role(this, 'ServiceAccountRole', {
    roleName: 'ServiceAccountRole',
    assumedBy: new iam.FederatedPrincipal(???),
    managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('SecretsManagerReadWrite')]
});

const serviceAccount = cluster.addServiceAccount('ServiceAccount', {
    name: 'eso-service-account',
    annotations: {
        'eks.amazonaws.com/role-arn': serviceAccountRole.roleArn
    }
});
解决方案

手动构建FederatedPrincipal的写法

FederatedPrincipal需要传入三个核心参数:OIDC提供商ARN、信任条件、允许的动作。你可以通过CDK的集群对象动态获取OIDC信息,避免硬编码:

// 从EKS集群对象获取OIDC提供商信息
const oidcProviderArn = cluster.openIdConnectProvider.openIdConnectProviderArn;
const oidcIssuer = cluster.openIdConnectProvider.openIdConnectProviderIssuer;
const serviceAccountName = 'eso-service-account';
const namespace = 'default';

const serviceAccountRole = new iam.Role(this, 'ServiceAccountRole', {
  roleName: 'ServiceAccountRole',
  assumedBy: new iam.FederatedPrincipal(
    // 第一个参数:OIDC提供商的ARN
    oidcProviderArn,
    // 第二个参数:信任条件,和指南中的Condition完全匹配
    {
      StringEquals: {
        [`${oidcIssuer}:sub`]: `system:serviceaccount:${namespace}:${serviceAccountName}`,
        [`${oidcIssuer}:aud`]: 'sts.amazonaws.com'
      }
    },
    // 第三个参数:允许的STS动作
    'sts:AssumeRoleWithWebIdentity'
  ),
  managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('SecretsManagerReadWrite')]
});

const serviceAccount = cluster.addServiceAccount('ServiceAccount', {
  name: serviceAccountName,
  namespace: namespace,
  annotations: {
    'eks.amazonaws.com/role-arn': serviceAccountRole.roleArn
  }
});

更简洁的CDK最佳实践写法

其实CDK的cluster.addServiceAccount方法可以自动创建对应的IAM角色并配置正确的信任关系,不需要手动构建FederatedPrincipal,代码更简洁:

const serviceAccount = cluster.addServiceAccount('EsoServiceAccount', {
  name: 'eso-service-account',
  namespace: 'default'
});

// 给自动创建的角色附加权限
serviceAccount.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('SecretsManagerReadWrite'));

这种方式下,CDK会自动生成和指南中一致的信任关系,无需手动配置FederatedPrincipal,减少出错概率。

内容的提问来源于stack exchange,提问作者James Kelleher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:05:26