如何在serverless.yml文件中引用函数(Lambda)的ARN函数?

25

考虑在 serverless.yml 文件中的这个 lambda 函数:

functions:
  s3toEc2Lambda:
    handler: s3toec2lambda.S3toEc2Lambda
    name: "${self:service}-s3toEc2Lambda"
    role: S3toEc2LambdaRole

考虑到资源部分创建了这个SNS:有人知道如何从lambda函数s3toEc2Lambda通知Sns ARN终点?

resources:
  Resources:
    WordpressFrontEndSnsS3toEc2:
      Type: AWS::SNS::Topic
      Properties:
        TopicName: "wordpress-front-end-s3-ec2"

    WordpressFrontEndSnsS3toEc2Lambda:
      Type: AWS::SNS::Subscription
      Properties:
        Endpoint: { "Fn::GetAtt": ["s3toEc2Lambda", "Arn" ] }                    <------ HERE    <------
        #Endpoint: ${self:functions.s3toEc2Lambda}                               <------ OR HERE <------
        #Endpoint: { "Fn::GetAtt": ["${self:functions.s3toEc2Lambda}", "Arn" ] } <------ OR HERE <------
        Protocol: lambda
        TopicArn: !Ref 'WordpressFrontEndSnsS3toEc2'

对我来说,总是出现这样的错误消息:“Template error: instance of Fn::GetAtt references undefined resource s3toEc2Lambda”

谢谢!


你好Marcin,现在没问题了,谢谢关心。 - Carlos Valença de Paula
1
很好。如果是这样,那么希望您能接受我的答案。 - Marcin
怎么样了?你还不清楚自己能做什么吗? - Marcin
2个回答

28

由Serverless创建的CloudFormation资源具有已知格式。对于Lambda函数,格式为:

{normalizedFunctionName}LambdaFunction

因此,您应该能够使用以下方式引用您的函数:

"Fn::GetAtt": [ S3toEc2LambdaLambdaFunction, Arn ]

这方面的更多示例请参见此处链接


如果资源在不同的服务中,该怎么办? - Diego Ponciano
1
由于某些原因,如果 Lambda 函数的名称为 s3to-ec2-lambda,则无法正常工作,我不得不将其更改为 s3toEc2Lambda。 - Yao
1
这应该被标记为答案,看一下链接,确保你正确引用了函数的名称。 大小写和格式确实很重要! - Cai Allin

0
我们可以通过这种方式创建函数角色、函数策略以及 Lambda 函数 SAM 模板文件。
    Type: AWS::IAM::Role
    Properties:
      RoleName: UatAdminUserStatsLambda
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Service:
                - 'lambda.amazonaws.com'
            Action:
              - 'sts:AssumeRole'

  FunctionPolicy:
    Type: AWS::IAM::Policy
    DependsOn: FunctionRole
    Properties:
      PolicyName: UserStatsPolicy
      Roles:
        - !Ref FunctionRole
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Action:
              - 'iam:GetUser'
              - 'logs:CreateLogGroup'
              - 'logs:CreateLogStream'
              - 'logs:GetLogEvents'
              - 'logs:PutLogEvents'
              - 's3:GetObject'
              - 's3:PutObject'
            Resource: '*'

  adminUsersList:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/admin/
      Role: !GetAtt FunctionRole.Arn
      Handler: adminUsersList.adminUsersList
      Layers:
        - !Ref NodeDependenciesLayer
      Events:
        adminUsersListEvent:
          Type: Api
          Properties:
            Path: /api/admins
            Method: GET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接