如何在Cloudformation的输出中显示lambda函数返回值

时间:2018-11-04 21:30:13

标签: aws-lambda amazon-cloudformation

我正在寻找在Cloudformation输出中列出AWS :: Lambda :: Function结果的选项。

以下是AWS:Lambda :: Function的cloudformation模板的代码段

Resources:
 AthenaLambdaFunction:
    Type: 'AWS::Lambda::Function'
    DeletionPolicy: Delete
    DependsOn:
      - IamRoleLambdaForAthena
    Properties:
      Code:
        ZipFile: |
          import boto3
          import botocore
          import os 
          ath = boto3.client('athena')
          def handler(event, context):
              outputBucket = os.environ.get("outputBucket")
              QSTRING = 'select * from tableName limit 10'
              response = ath.start_query_execution(QueryString=str(QSTRING), ResultConfiguration={'OutputLocation': outputBucket})
              s3BucketOut = output_bucket + response['ResponseMetadata']['RequestId']
              return s3BucketOut
      Handler: index.handler
      Runtime: python3.6
      MemorySize: 128
      Role: !GetAtt IamRoleLambdaForAthena.Arn
      Timeout: 30
      Environment:
        Variables:
          outputBucket: !Ref OutputS3Bucket

我想在Cloudformation的输出中显示由lambda函数s3BucketOut重新调整的值。像下面这样(当然,下面的代码不起作用)。

Outputs:
  LambdaFunctionOutput:
    Value: !Ref AthenaLambdaFunction.s3BucketOut
    Description: Return Value of Lambda Function

请提出任何建议。 TIA

2 个答案:

答案 0 :(得分:1)

您可以做的是创建所谓的“ Lambda支持的自定义资源”。您可以在创建堆栈时使用它来获取创建类型的信息。

更多信息可以在这里找到

AWS Lambda-backed Custom Resources

答案 1 :(得分:0)

您已经过了一半。使用您的代码,创建了要运行的AWS Lambda函数。现在,您需要使此函数在CloudFormation上运行并获取其价值。请注意,您需要对代码进行一些小的更改,以允许CloudFormation捕获该值。

完整代码将与此类似:

Resources:
  AthenaLambdaFunction:
    Type: 'AWS::Lambda::Function'
    DeletionPolicy: Delete
    DependsOn:
      - IamRoleLambdaForAthena
    Properties:
      Code:
        ZipFile: |
          import boto3
          import botocore
          import os
          import cfnresponse # this needs to be imported for replying to CloudFormation
          ath = boto3.client('athena')
          def handler(event, context):
              outputBucket = os.environ.get("outputBucket")
              QSTRING = 'select * from tableName limit 10'
              response = ath.start_query_execution(QueryString=str(QSTRING), ResultConfiguration={'OutputLocation': outputBucket})
              s3BucketOut = output_bucket + response['ResponseMetadata']['RequestId']
              responseData = {} # added
              responseData['S3BucketOut'] = s3BucketOut # added
              cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData) # return modified
      Handler: index.handler
      Runtime: python3.6
      MemorySize: 128
      Role: !GetAtt IamRoleLambdaForAthena.Arn
      Timeout: 30
      Environment:
        Variables:
          outputBucket: !Ref OutputS3Bucket

  S3BucketOutInvocation:
    Type: Custom::S3BucketOut
    Properties:
      ServiceToken: !GetAtt AthenaLambdaFunction.Arn
      Region: !Ref "AWS::Region"

Outputs:
  LambdaFunctionOutput: 
    Value: !GetAtt S3BucketOutInvocation.S3BucketOut
    Description: Return Value of Lambda Function

参考文献:

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html