允许 CodeBuildAction 更新 SSM 参数

Allow CodeBuildAction to update SSM parameter

我目前正在尝试通过 CodeBuildAction 设置 SSM Parameter Store 值。我的第一次尝试产生了 254 return 代码,我猜这是因为请求未被授权。然后,我尝试将托管策略附加到与 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
  ],
});

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

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

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

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,
        }),
      ],
    }),
  },
});

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

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

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

mySsmParameter.grantWrite(myCodeBuildAction.actionProperties.role);

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

mySsmParameter.grantWrite(myCodeBuildProject);

仅此而已,CDK 将在后台处理所需的语句。