Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 为什么我的Lambda函数在从CodePipeline调用时不接收事件数据?_Amazon Web Services_Go_Aws Lambda_Aws Codepipeline - Fatal编程技术网

Amazon web services 为什么我的Lambda函数在从CodePipeline调用时不接收事件数据?

Amazon web services 为什么我的Lambda函数在从CodePipeline调用时不接收事件数据?,amazon-web-services,go,aws-lambda,aws-codepipeline,Amazon Web Services,Go,Aws Lambda,Aws Codepipeline,我有一个用于部署Go应用程序的代码管道,现在我正尝试使用golang migrate使其应用数据库迁移。我在Go中编写了一个Lambda函数来应用迁移,但是当从CodePipeline调用它时,它不会接收带有修订位置、用户参数等的事件数据。为了简单起见,我删除了迁移代码,并将其替换为只将事件数据写入CloudWatch的代码: package main import ( "context" "fmt" "github.

我有一个用于部署Go应用程序的代码管道,现在我正尝试使用golang migrate使其应用数据库迁移。我在Go中编写了一个Lambda函数来应用迁移,但是当从CodePipeline调用它时,它不会接收带有修订位置、用户参数等的事件数据。为了简单起见,我删除了迁移代码,并将其替换为只将事件数据写入CloudWatch的代码:

package main

import (
    "context"
    "fmt"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func Handler(ctx context.Context, job events.CodePipelineJob) (string, error) {    
    fmt.Printf("%#v", job)    
    return "Success", nil
}

func main() {
    lambda.Start(Handler)
}
当CodePipeline运行时,它会触发函数,我从函数中的fmt.Printf语句在CloudWatch中找到以下日志:

import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def main(event, context):    
    logger.info("Event: " + str(event))

    return "Success"
package main

import (
    "context"
    "fmt"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func Handler(ctx context.Context, event events.CodePipelineEvent) (string, error) {
    fmt.Printf("%#v", event)
    return "Success", nil
}

func main() {
    lambda.Start(Handler)
}
events.CodePipelineJob{ID:,AccountID:,数据:events.CodePipelineData{ActionConfiguration:events.CodePipelineActionConfiguration{Configuration:events.CodePipelineConfiguration{FunctionName:,UserParameters:}},InputArtifacts:[]事件。CodePipelineInputArtifacts(nil),OutPutArtifacts:[]事件。CodePipelineOutputArtifacts(nil),ArtifactCredentials:events.CodePipelineArtifactCredentials{SecretAccessKey:,SessionToken:,AccessKeyID:},ContinuationToken:}

作业参数是一个空对象,没有像我预期的那样绑定到CodePipeline事件数据。我所做的所有研究都表明,它应该接收此处定义的CodePipelineJob事件:

我已经确认,如果我使用Python Lambda函数,将收到预期的JSON事件格式:

import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def main(event, context):    
    logger.info("Event: " + str(event))

    return "Success"
package main

import (
    "context"
    "fmt"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func Handler(ctx context.Context, event events.CodePipelineEvent) (string, error) {
    fmt.Printf("%#v", event)
    return "Success", nil
}

func main() {
    lambda.Start(Handler)
}
当我将CodePipeline改为调用Python函数时,包含正确数据的事件成功写入CloudWatch。它看起来像这样:

{
   "CodePipeline.job":{
      "id":"11111111-abcd-1111-abcd-111111abcdef",
      "accountId":"111111111111",
      "data":{
         "actionConfiguration":{
            "configuration":{
               "FunctionName":"MyLambdaFunctionForAWSCodePipeline",
               "UserParameters":"some-input-such-as-a-URL"
            }
         },
         "inputArtifacts":[
            {
               "location":{
                  "s3Location":{
                     "bucketName":"the name of the bucket configured as the pipeline artifact store in Amazon S3, for example codepipeline-us-east-2-1234567890",
                     "objectKey":"the name of the application, for example CodePipelineDemoApplication.zip"
                  },
                  "type":"S3"
               },
               "revision":null,
               "name":"ArtifactName"
            }
         ],
         "outputArtifacts":[            
         ],
         "continuationToken":"A continuation token if continuing job",
         "encryptionKey":{
            "id":"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "type":"KMS"
         }
      }
   }
}

所以,我的问题是,为什么我的Python Lambda函数会编写事件,而我的Go函数不会?我定义参数的方式有问题吗?

我对输入参数使用了错误的事件类型。当我将参数类型更改为events.CodePipelineEvent时,函数开始正确记录事件详细信息。输入事件中的根JSON元素名为CodePipeline.job。events.CodePipelineEvent结构的定义如下:

CodePipelineEvent struct {
    CodePipelineJob CodePipelineJob `json:"CodePipeline.job"`
}
一旦我将参数切换到正确的类型,它就开始正确匹配根元素并引入值。以下是更新后的函数:

import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def main(event, context):    
    logger.info("Event: " + str(event))

    return "Success"
package main

import (
    "context"
    "fmt"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func Handler(ctx context.Context, event events.CodePipelineEvent) (string, error) {
    fmt.Printf("%#v", event)
    return "Success", nil
}

func main() {
    lambda.Start(Handler)
}