如何使用AWS SAM将基于资源的策略添加到Lambda

时间:2020-06-23 22:29:39

标签: amazon-web-services amazon-s3 aws-lambda yaml aws-sam

我想使用AWS SAM为某些lambda函数创建部署脚本。其中两个功能将部署到一个帐户(帐户A)中,但将由第二个帐户(帐户B)中的s3存储桶对象创建事件触发。据我所知,唯一的方法就是在lambda中使用基于资源的策略。但是我不知道如何在AWS SAM中做到这一点。我当前的yaml文件如下所示。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  deploy-test-s3-triggered-lambda

Parameters:
  AppBucketName:
    Type: String
    Description: "REQUIRED: Unique S3 bucket name to use for the app."

Resources:
  S3TriggeredLambda:
    Type: AWS::Serverless::Function
    Properties: 
      Role: arn:aws:iam::************:role/lambda-s3-role
      Handler: src/handlers/s3-triggered-lambda.invokeAPI
      CodeUri: src/handlers/s3-triggered-lambda.js.zip
      Runtime: nodejs10.x
      MemorySize: 128
      Timeout: 60
      Policies:
        S3ReadPolicy:
          BucketName: !Ref AppBucketName
      Events:
        S3NewObjectEvent:
          Type: S3
          Properties:
            Bucket: !Ref AppBucket
            Events: s3:ObjectCreated:*
  AppBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref AppBucketName

我需要添加到此yaml文件中以绑定基于资源的策略,以允许跨帐户访问我的lambda函数吗?

3 个答案:

答案 0 :(得分:1)

这可以在使用 AWS::Lambda::Permissionaws_cdk.aws_lambda.CfnPermission 的帮助下完成。

例如,要允许从另一个帐户中的角色调用您的 lambda,请将以下内容添加到您的 CDK:

from aws_cdk import aws_lambda

aws_lambda.CfnPermission(
    scope,
    "CrossAccountInvocationPermission",
    action="lambda:InvokeFunction",
    function_name="FunctionName",
    principal="arn:aws:iam::111111111111:role/rolename",
)

答案 1 :(得分:0)

如果您的存储桶和Lambda函数存在于单独的帐户中,我不知道是否可以通过SAM /单个CloudFormation模板修改它们。

答案 2 :(得分:-1)

不要认为SAM可能会发生跨帐户s3事件,可能需要回到CFN。