Amazon web services 自定义资源的Lambda函数存在问题:没有名为cfnresponse的模块

Amazon web services 自定义资源的Lambda函数存在问题:没有名为cfnresponse的模块,amazon-web-services,lambda,aws-lambda,amazon-cloudformation,Amazon Web Services,Lambda,Aws Lambda,Amazon Cloudformation,我正在尝试使用Lambda函数创建CloudFormation自定义资源。这是我的职责: "SubnetToVpcFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { "ZipFile" : { "Fn::Join" : ["\n", [ "import cfnrespon

我正在尝试使用Lambda函数创建CloudFormation自定义资源。这是我的职责:

    "SubnetToVpcFunction": {
        "Type": "AWS::Lambda::Function",
        "Properties": {
            "Code": {
                "ZipFile" : { "Fn::Join" : ["\n", [
                    "import cfnresponse",
                    "import json, boto3 ",
                    "def handler(event, context): ",
                    "   ec2 = boto3.resource('ec2') ",
                    "   subnet = ec2.Subnet(event['ResourceProperties']['Subnet']) ",
                    "   vpc_id = subnet.vpc_id ",
                    "   responsedata = { 'VPCID' : vpc_id } ",
                    "   cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, \"CustomResourcePhysicalID\") "
                ] ] }
            },
            "Handler": "index.handler",
            "Runtime": "python2.7",
            "Timeout": "30",
            "Role": { "Fn::Join" : [ "", [ "arn:aws:iam::", { "Ref" : "AWS::AccountId" }, ":role/", { "Fn::FindInMap" : [ "AccountMapping", { "Ref" : "AWS::AccountId" }, "Role" ] } ] ] },
        }
    }
Unable to import module 'index': No module named cfnresponse
当我尝试将此函数用于另一个模板中的自定义资源时,自定义资源无法稳定,我在该函数的CloudWatch日志中看到此错误:

    "SubnetToVpcFunction": {
        "Type": "AWS::Lambda::Function",
        "Properties": {
            "Code": {
                "ZipFile" : { "Fn::Join" : ["\n", [
                    "import cfnresponse",
                    "import json, boto3 ",
                    "def handler(event, context): ",
                    "   ec2 = boto3.resource('ec2') ",
                    "   subnet = ec2.Subnet(event['ResourceProperties']['Subnet']) ",
                    "   vpc_id = subnet.vpc_id ",
                    "   responsedata = { 'VPCID' : vpc_id } ",
                    "   cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, \"CustomResourcePhysicalID\") "
                ] ] }
            },
            "Handler": "index.handler",
            "Runtime": "python2.7",
            "Timeout": "30",
            "Role": { "Fn::Join" : [ "", [ "arn:aws:iam::", { "Ref" : "AWS::AccountId" }, ":role/", { "Fn::FindInMap" : [ "AccountMapping", { "Ref" : "AWS::AccountId" }, "Role" ] } ] ] },
        }
    }
Unable to import module 'index': No module named cfnresponse

根据AWS文档,当使用
ZipFile
属性内联指定函数代码时,可以在Lambda函数中导入
cfnresponse
python包。那么为什么它不能加载这个包呢?

我确实使用terraform部署了lambda函数,并且必须自己嵌入模块。使用pip和virtualenv或使用您提到的AWS文档附带的文件从中获取


文档建议,如果您使用cloudformation和内联代码(作为ZipFile),但我没有进行测试。

好吧,如果我必须自己嵌入模块,那么我就不能在CFT中定义内联函数(因为我必须手动构建包含依赖项的函数包)我从定义函数内联中得到的主要好处是不必担心构建/部署函数包。谢谢你的评论!答案如下: