0

我目前正在尝试通过 CodeBuildAction 设置 SSM 参数存储值。我的第一次尝试导致254返回代码,我猜这是因为请求未授权。然后,我尝试将托管策略附加到与 CodeBuildAction 关联的角色,但cdk deploy失败了:

Policy arn:aws:iam::aws:policy/AWSServiceRoleForAmazonSSM does not exist or is not attachable. (Service: AmazonIdentityManagement; Status Code: 404; Error Code: NoSuchEntity; Request ID: 2f65f8db-64a5-4173-ac45-de4c56bffa44; Proxy: nu
ll)

这是角色设置:

this.codeBuildRole = new Role(this, "application-build-project-role", {
  assumedBy: new ServicePrincipal("codebuild.amazonaws.com"),
  managedPolicies: [
    ManagedPolicy.fromAwsManagedPolicyName(
      "AmazonEC2ContainerRegistryPowerUser"
    ),
    ManagedPolicy.fromAwsManagedPolicyName("AWSServiceRoleForAmazonSSM"), // THIS IS THE NEW PART
  ],
});

我知道这意味着我使用了错误的政策,但我正在努力寻找替代方案。

是否有适用于此处的托管策略?如果没有,我将如何设置内联策略来实现我想要做的事情?

4

2 回答 2

1

解决这个问题的惯用方法是使用 CDK 的抽象来修改角色,而不是创建自己的。

假设您要更新特定参数,这就是它的样子。您将为您拥有的每个参数执行此操作。

mySsmParameter.grantWrite(myCodeBuildAction.actionProperties.role);

或者,您可以授予对操作项目的访问权限:

mySsmParameter.grantWrite(myCodeBuildProject);

就是这样,CDK 将在后台处理所需的语句。

于 2022-02-07T11:06:20.700 回答
0

我能够让它与这个一起工作:

this.codeBuildRole = new Role(this, "application-build-project-role", {
  assumedBy: new ServicePrincipal("codebuild.amazonaws.com"),
  managedPolicies: [
    ManagedPolicy.fromAwsManagedPolicyName(
      "AmazonEC2ContainerRegistryPowerUser"
    ),
  ],
  inlinePolicies: {
    SSMPutItem: new PolicyDocument({
      statements: [
        new PolicyStatement({
          resources: ["*"],
          actions: ["ssm:*"],
          effect: Effect.ALLOW,
        }),
      ],
    }),
  },
});

它可能比它需要的更放松,但这确实解决了问题。

于 2022-02-07T03:15:47.577 回答