AWS Лямбда не работает при развертывании с CDK - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь развернуть лямбду, используя AWS CDK, и, похоже, он не работает / развертывается должным образом. «Коробка» в конвейере зеленого цвета, поэтому ошибки не возвращаются.

Кажется, все в порядке, но когда я запустил его вручную для проверки, я получаю следующее сообщение:

{
  "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."
}

Проблема в том, что если я загружаю артефакт вручную на свой компьютер и загружаю его с помощью кнопки Function package загрузки, он работает правильно.

У меня есть один Stack, который содержит CfnParametersCode, который является стеком, который я использую для создания лямбда.

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;
    }
}

, а затем у меня есть конвейер, на котором создается один из шагов лямбда:

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.Assign(lambdaBuildOutput.S3Location) что кажется прекрасным, потому что когда создается лямбда, и он определяет размер, который совпадает с размером, который должен был быть лямбда, но когда я его выполняю, я получаю "errorMessage": "Could not find the required 'QuickSight.Lambdas.SpiceRefresh.deps.json'. This file should be present at the root of the deployment package."

On результат с файлом Cloudformation тоже в порядке:

 "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
    }
}

Я проверил перед созданием сообщения, и у большинства людей были проблемы с обработчиком. К сожалению, если я загружаю вручную объект в appLambdaSourceBucketNameParameter, appLambdaSourceObjectKeyParameter и загружаю его в лямбду, он работает отлично. Я думаю, это исключит мою проблему.

Есть идеи, что может быть не так?

1 Ответ

0 голосов
/ 29 мая 2020

Нашел решение.

Проблема в том, что в артефакте я возвращаю лямбда .zip

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

Но что мне действительно нужно, так это вернуть двоичные файлы лямбда . (папка publi sh)

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

больше ничего не изменилось, и это сработало.

Перевод облачной информации:

до экспорта artifact::app.Lambdas.Action.zip затем AWS пытался найти двоичные файлы. Теперь он экспортирует artifact::**.*, поэтому все файлы.

...