当前位置: 首页 > 知识库问答 >
问题:

与CDK一起部署时,AWS Lambda不工作

冀胤运
2023-03-14

我正在尝试使用AWS CDK部署lambda,但它似乎无法正常工作/部署。管道中的“框”为绿色,因此不会返回任何错误。

一切似乎都很好,但是当我手动运行它进行测试时,我收到了下一条消息:

{
  "errorType": "LambdaException",
  "errorMessage": "Could not find the required 'QuickSight.Lambdas.SpiceRefresh.deps.json'.  This file should be present at the root of the deployment package."
}

问题是,如果我手动将人工制品下载到我的机器上,并使用功能包上传按钮将其上载,它将正常工作。

我有一个堆栈,其中包含CfnParametersCode,这是我用来创建lambda的堆栈。

public class LambdaStack : Stack
{

    public CfnParametersCode LambdaCode { get; set; }

    //code

    private Function BuildSpiceRefreshLambda()
    {
        LambdaCode = Code.FromCfnParameters();

        var func = new Function(this, Constants.Lambda.LambdaName, new FunctionProps
        {
            Code = LambdaCode,
            Handler = Constants.Lambda.LambdaHandler,
            FunctionName = Constants.Lambda.LambdaName,
            MemorySize = 1024,
            Tracing = Tracing.ACTIVE,
            Timeout = Duration.Seconds(480),
            Runtime = Runtime.DOTNET_CORE_2_1,
            Environment = new Dictionary<string, string>()
            {
                {"ENVIRONMENT", Fn.Ref(Constants.EnvironmentVariables.Environment)},
                {"APPLICATION_NAME", Constants.Lambda.ApplicationName},
                {"AWS_ACCOUNT_ID", Fn.Ref("AWS::AccountId")},
                {"LOG_GROUP_NAME", Constants.Lambda.LogGroupName}
            },
            ReservedConcurrentExecutions = 1,
            Role = SpiceRefreshLambdaRole,
            Vpc = this.GetProjectVpc(),
            SecurityGroups = new ISecurityGroup[]
            {
                securityGroup
            }
        });
        return func;
    }
}

然后我有管道,其中一个步骤是构建lambda:

var lambdaBuild = new PipelineProject(this, "appLambda", new PipelineProjectProps
{
    BuildSpec = BuildSpec.FromObject(new Dictionary<string, object>
    {
        ["version"] = "0.2",
        ["phases"] = new Dictionary<string, object>
        {
            ["install"] = new Dictionary<string, object>
            {
                ["commands"] = new string[]
                {
                    "echo \"Installing lambda tools for dotnet\"",
                    "dotnet tool install -g Amazon.Lambda.Tools",
                }
            },
            ["build"] = new Dictionary<string, object>
            {
                ["commands"] = new string[]
                {
                    "echo \"Packaging app lambda\"",
                    "(cd app/src/Lambdas/app.Lambdas.Action; dotnet lambda package)"
                }
            }
        },
        ["artifacts"] = new Dictionary<string, object> 
        {
            ["files"] = new[]
            {
                "app/src/Lambdas/app.Lambdas.Action/bin/Release/netcoreapp2.1/app.Lambdas.Action.zip",
            }
        }
    }),
    Environment = new BuildEnvironment
    {
        BuildImage = LinuxBuildImage.STANDARD_2_0
    }
});

var lambdaBuildOutput = new Artifact_("LambdaBuildOutput");


new Amazon.CDK.AWS.CodePipeline.Pipeline(this, "appPipeline", new PipelineProps
{
    ArtifactBucket = Bucket.FromBucketAttributes(this, "artifact-bucket", new BucketAttributes
    {
        BucketArn = "bucket",
        EncryptionKey = "key"
    }),
    Role = "role",
    Stages = new[]
    {
        new StageProps
        {
            StageName = "Source",
            Actions = new[]
            {
                new CodeCommitSourceAction(new CodeCommitSourceActionProps
                {
                    ActionName = "Source",
                    Repository = code,
                    Output = sourceOutput,
                })
            }
        },
        new StageProps
        {
            StageName = "Build",
            Actions = new[]
            {
                new CodeBuildAction(new CodeBuildActionProps
                {
                    ActionName = "Lambda_Build",
                    Project = lambdaBuild,
                    Input = sourceOutput,
                    Outputs = new[] {lambdaBuildOutput},
                }),
            }
        },
        new StageProps
        {
            StageName = "Deploy",
            Actions = new[]
            {
                new CloudFormationCreateUpdateStackAction(new CloudFormationCreateUpdateStackActionProps
                {
                    ActionName = "DeployLambdaapp",
                    TemplatePath = props.appLambdaStack.StackTemplate,
                    StackName = "appLambdaDeploymentStack",
                    AdminPermissions = true,
                    ParameterOverrides = props.appLambdaStack.LambdaCode.Assign(lambdaBuildOutput.S3Location), 
                    ExtraInputs = new[] {lambdaBuildOutput},
                    Role = "role",
                    DeploymentRole = "deployRole"
                }),
            }
        }
    }
});
  • 还有更多的步骤,但它们并不相关

如您所见,我正在将ParameterOverrides应用于props.appLambdaStack。LambdaCode.分配(lambdaBuildOutput.这似乎是好的,因为当lambda被创建时,它指定了大小,这与lambda应该是相同的大小,但是当我执行它时,我收到错误消息:找不到需要'QuickSight。兰姆达斯。SpiceRefresh.deps.json'。这个文件应该存在于部署包的根目录中。"

结果云形成文件似乎也很好:

 "appLambdaF0BB8286": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Code": {
          "S3Bucket": {
            "Ref": "appLambdaSourceBucketNameParameter"
          },
          "S3Key": {
            "Ref": "appLambdaSourceObjectKeyParameter"
          }
        },
        "Handler": "Constants.Lambda.LambdaHandler",  //same as the constant in c#

        //Rest of the properties
    }
}

在创建帖子之前,我检查了一下,大多数人对处理程序都有问题。幸运的是,如果我手动下载appLambdaSourceBucketNameParameterappLambdaSourceObjectKeyParameter中的对象并将其上载到lambda中,它就可以正常工作。我想这将排除我的问题。

知道什么是错的吗?


共有1个答案

狄子真
2023-03-14

找到了解决办法

问题是,在工件中,我返回lambda。邮政编码

["files"] = new[]
{
    "app/src/Lambdas/app.Lambdas.Action/bin/Release/netcoreapp2.1/app.Lambdas.Action.zip",
}

但是我真正需要的是返回lambda的二进制文件。(发布文件夹)

["artifacts"] = new Dictionary<string, object> 
{
    ["base-directory"] = "app/src/Lambdas/app.Lambdas.Action/bin/Release/netcoreapp2.1/publish",
    ["files"] = new[] { "**.*" }
}

其他的一切都没有改变,它起了作用。

云层翻译:

在我导出artifact::app之前。兰博达斯。行动zip然后AWS试图找到二进制文件。现在它正在导出工件::*** ,所以所有的文件。

 类似资料:
  • 应该连接到easyphp服务器上的phpmyadmin数据库,在users数据库上插入一条记录,所有这一切都通过glassfish服务器通过web服务进行,但这并没有发生 netbeans表示,glassfish之所以能够运行,是因为它只有一个停止、删除或重新启动服务器的选项,但“start”选项是灰色的 这是错误日志 java.lang.RuntimeException:java.io.ioEx

  • 我正在做一个ML项目,利用AWS Lambda构建模型和生成预测。Lambdas是用python编写的,并使用几个ML库,如熊猫、skLearning、Numpy和Scikit学习。这些lambda使用由Lambda层打包的共享代码。我使用AWS CDK进行项目部署。CDK代码是用TypeScript编写的,不要问我为什么要混合Python和TypeScript,这与此情况无关。 由于存在ML库,

  • 我有一个AWS架构,其中我介绍了一个配置数据库,多个Lambdas将依赖于此。 配置数据库通过CDK填充:通过创建S3 bucket,将数据上传到S3 bucket,S3 bucket反过来通知将填充数据库的Lambda。 我有其他Lambda依赖于正在填充的数据库,其中一个Lambda位于cron上,最初由CDK通过自定义资源调用,因此计时非常关键。 目前,所有AWS资源都是通过单个堆栈部署的,

  • 我注意到我的机器人没有设置RichPresence,就像我今天看它一样。我最后一次检查它是在星期三,代码也在那里工作。所以我今天再次执行它,并且RichPresence没有像往常一样重新设置。现在我认为不和谐会改变它的界面。 现在,我在我的项目中使用了最新的JDA版本,并对代码进行了修改,使数据对象成为JSONObject,但它仍然无法工作。作为第二个,我试图使我的“Spielst”对象成为Ric

  • 根据它的Javadoc,将生成,其中的第一个值是subscribe和第一个next信号之间的经过时间。 以下测试不起作用 它将抛出异常: 我原以为经过的时间至少是1000ms,但结果只有11ms。

  • 在我的Laravel应用程序中,我需要定期使用Guzzle将数据发送到API。 API使用承载令牌进行身份验证,并请求和接受原始JSON。为了进行测试,我使用Postman访问了API,一切都工作得很好。