AWS Copilot - 将导入的策略附加到任务角色

时间:2021-07-08 15:05:07

标签: amazon-web-services amazon-cloudformation amazon-iam

我正在尝试在以下场景中使用 CloudFormation AddOn 模板:

  • 服务 1 创建一个 SNS 主题和一个托管策略,该策略具有向其发布所需的所有权限。 SNS 主题将收集“活动”记录,然后将它们分发给多个订阅者。
  • 一个通用代码库将 SNS 的使用抽象化 - 任何需要发布活动消息的应用程序都不会知道 SNS 正在被使用。
  • 服务 N 需要使用公共代码库发布活动消息,并且需要任何必要的权限。

因此,服务 1 将托管策略 ARN 作为导出输出写入 AddOn 堆栈,如下所示:

Outputs:
  activityPublishPolicy:
    Description: "Activity Publish Policy ARN"
    Value: !Ref activitySnsTopicPublishPolicy
    Export:
      Name: !Sub ${App}-${Env}-activity-publish-policy

然后在服务 N 中,我希望导入发布策略的 ARN 并将其附加到任务角色:

Outputs:
  activityPublishAccessPolicy:
    Description: "The IAM::ManagedPolicy to attach to the task role."
    Value: !ImportValue
      'Fn::Sub': '${App}-${Env}-activity-publish-policy'

ARN 被很好地导入并写入服务 N 的 Cloud Formation 堆栈;但是,任务角色没有附加托管策略。

我做了一个快速测试,看看直接将策略添加到 AddOn 堆栈是否会附加并且确实有效。

Outputs:
  activityPublishAccessPolicy:
    Description: "The IAM::ManagedPolicy to attach to the task role."
    Value: !Ref activityPolicy

这让我相信 Copilot 仅将 ManagedPolicies 附加到在其自己的 AddOn Stack 中创建的任务角色,但这只是猜测。

我不想在每项服务中编写新策略来执行此操作,并且如果可能,我不想在我们的整个 VPC 中打开主题策略。

有没有更好的方法来做到这一点? 谢谢!

1 个答案:

答案 0 :(得分:0)

这是因为 Copilot 会扫描插件模板以确定您输出的资源类型。插件有几个“神奇”的输出。它们是:

  • 安全组
  • 托管政策
  • 秘密

为了检测这些输出,我们扫描模板以查找引用资源的逻辑 ID。这意味着我们目前无法推导出 Fn::ImportValue 调用结果的资源类型,因为它们不引用该插件模板中定义的逻辑 ID!

很抱歉,这给您带来了问题——您似乎需要将托管策略添加到您要授予此访问权限的每个服务的插件堆栈中。不过,这是我们可以做的事情,如果您能给我们减少 Github 问题,以便我们可以优先考虑并收集提案的反馈,我们会很高兴。

相关问题