He implementado un AWS lambda que contiene:
import json import boto3 import cfnresponse import urllib.request from botocore.exceptions import ClientError def lambda_handler(event, context): ... cfnresponse.send(event, context, status, responseData, "CustomResourcePhysicalID") Traté de obtener los valores de cfnresponse en mis formaciones en la nube:
Resources: API: Type: Custom::API Version: '1.0' Properties: ServiceToken: arn:aws:lambda:eu-west-1:1234567891011:function:getCountry Outputs: Status: Value: !GetAtt API.DataAhora el cfn está atascado y recibí el error:
Unable to import module 'lambda_function': No module named 'cfnresponse'¿Qué estoy haciendo mal? Parece la manera de hacerlo cuando reviso los documentos .
Cfnresponse solo está disponible en lambda de forma predeterminada con python 2.7. Probablemente estés usando 3.6.
¿Especificó el código fuente de su función en ZipFile ? Si especifica un archivo zip real, ese módulo no se incluirá.
Cuando utiliza la propiedad ZipFile para especificar el código fuente de su función y esa función interactúa con un recurso personalizado de AWS CloudFormation, puede cargar el módulo cfn-response para enviar respuestas a esos recursos. El módulo contiene un método de envío, que envía un objeto de respuesta a un recurso personalizado a través de una URL prefirmada de Amazon S3 (ResponseURL).
Si necesita usar un archivo zip real, o esto no funciona por alguna otra razón, puede incluir el módulo usted mismo. Su código fuente está disponible en el enlace que proporcionó. Para Python 3 es:
# Copyright 2016 Amazon Web Services, Inc. or its affiliates. All Rights Reserved. # This file is licensed to you under the AWS Customer Agreement (the "License"). # You may not use this file except in compliance with the License. # A copy of the License is located at http://aws.amazon.com/agreement/ . # This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or implied. # See the License for the specific language governing permissions and limitations under the License. from botocore.vendored import requests import json SUCCESS = "SUCCESS" FAILED = "FAILED" def send(event, context, responseStatus, responseData, physicalResourceId=None, noEcho=False): responseUrl = event['ResponseURL'] print(responseUrl) responseBody = {} responseBody['Status'] = responseStatus responseBody['Reason'] = 'See the details in CloudWatch Log Stream: ' + context.log_stream_name responseBody['PhysicalResourceId'] = physicalResourceId or context.log_stream_name responseBody['StackId'] = event['StackId'] responseBody['RequestId'] = event['RequestId'] responseBody['LogicalResourceId'] = event['LogicalResourceId'] responseBody['NoEcho'] = noEcho responseBody['Data'] = responseData json_responseBody = json.dumps(responseBody) print("Response body:\n" + json_responseBody) headers = { 'content-type' : '', 'content-length' : str(len(json_responseBody)) } try: response = requests.put(responseUrl, data=json_responseBody, headers=headers) print("Status code: " + response.reason) except Exception as e: print("send(..) failed executing requests.put(..): " + str(e))