为许多主体提供对 lambda 的调用权限的方法

Way to give many principals Invocation permissions to a lambda

我有一个需要访问超过 1 个主体的 lambda,所以我正在寻找在 CloudFormation 模板中创建所有必要调用权限的方法。

例如,帐户 123 和 456 将需要访问 MyFunction,因此这样的事情不会工作:

Resources:
  LambdaInvokePermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: arn:aws:lambda:us-west-2:${AWS::AccountId}:MyFunction
      Action: lambda:InvokeFunction          
      Principal: "123,456"

...它不会工作,因为 documentation 说它只接受字符串所以我认为可能将 CommaDelimitedList 参数传递给 CloudFormation 模板和使用 Fn:Join 可以完成这项工作。像这样:

Parameters:
  MyAccounts:
    Description: All accounts
    Type: CommaDelimitedList
...
Resources:
  CrossInvokePermission:
    Type: AWS::Lambda::Permission
    Properties:
      Fn::Join:
        - ""
        - - '{"Principal": {"AWS": ["'
          - Fn::Join: ['","', {Ref: MyAccounts} ]
          - '"]}, "Action": "lambda:InvokeFunction", "FunctionName" : "'
          - arn:aws:lambda:us-west-2:${AWS::AccountId}:function:MyFunction
          - '"}'

我的问题是,是否可以做我正在尝试的事情?到目前为止我的努力都失败了。

我认为目前在仅使用 CloudFormation 的单一资源中这是不可能的。

如果您不介意拥有多个资源,您可以让 InvokePermission 块使用不同的帐户 ID 多次出现。不过,我假设这不是您要找的。

如果您事先不知道需要允许访问多少帐户,或者如果您不想要那么多重复的样板文件,您可以使用模板预处理器从较小的模板生成模板一组输入。 google 中看起来合理的三个热门点击是 condense, fab_aws, and cloudformable,但我认识的大多数开发者只是自己编写了一些东西来满足他们的特定需求。