【问题标题】:Test Go Lambda locally with AWS Serverless Application Model and localstack使用 AWS 无服务器应用程序模型和 localstack 在本地测试 Go Lambda
【发布时间】:2022-09-29 17:03:47
【问题描述】:

我正在尝试在本地测试列出 S3 存储桶上的存储桶的 lambda 函数。

为了让我的测试使用本地 S3 存储桶,我使用 localstack:

docker run --rm -it -p 4566:4566 -p 4510-4559:4510-4559 localstack/localstack

然后我可以创建一个存储桶(它有效):

aws s3api --endpoint-url=http://localhost:4566  --region us-east-1 create-bucket --bucket images

然后我有一个尝试连接到 S3 并列出存储桶的 lambda:

package s3

import (
    \"context\"
    \"github.com/aws/aws-sdk-go-v2/aws\"
    \"github.com/aws/aws-sdk-go-v2/config\"
    awsS3 \"github.com/aws/aws-sdk-go-v2/service/s3\"
    \"fmt\"
    \"log\"
)

type S3ListBucketsAPI interface {
    ListBuckets(ctx context.Context,
        params *awsS3.ListBucketsInput,
        optFns ...func(*awsS3.Options)) (*awsS3.ListBucketsOutput, error)
}

func GetAllBuckets(c context.Context, api S3ListBucketsAPI, input *awsS3.ListBucketsInput) (*awsS3.ListBucketsOutput, error) {
    return api.ListBuckets(c, input)
}

func New(bucketName string) () {
    awsEndpoint := \"http://localhost:4566\"
    awsRegion := \"us-east-1\"
  
    customResolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) {
      if awsEndpoint != \"\" {
        return aws.Endpoint{
          PartitionID:   \"aws\",
          URL:           awsEndpoint,
          SigningRegion: awsRegion,
          HostnameImmutable: true,
        }, nil
      }
  
      return aws.Endpoint{}, &aws.EndpointNotFoundError{}
    })
  
    cfg, err := config.LoadDefaultConfig(context.TODO(),
      config.WithRegion(awsRegion),
      config.WithEndpointResolver(customResolver),
    )
    if err != nil {
      log.Fatalf(\"Cannot load the AWS configs: %s\", err)
    }

    client := awsS3.NewFromConfig(cfg)

    input := &awsS3.ListBucketsInput{}

    result, err := GetAllBuckets(context.TODO(), client, input)
    if err != nil {
        fmt.Println(err)
    }

    for _, bucket := range result.Buckets {
        fmt.Println(*bucket.Name + \": \" + bucket.CreationDate.Format(\"2006-01-02 15:04:05 Monday\"))
    }
}

为了在本地测试我的 lambda,我使用 SAM。这是模板:

AWSTemplateFormatVersion : \'2010-09-09\'
Transform: AWS::Serverless-2016-10-31
Description: AdBannerLambda
Resources:
  BucketListLambda:
    Type: AWS::Serverless::Function
    Properties:
      Handler: bin/bucket-list-lambda
      Runtime: go1.x
      Timeout: 100
      Policies:
        - S3FullAccessPolicy

当我执行 lambda 时:

sam local invoke AdBannerLambda  -e test_data/payload.json

我有这个错误:

START RequestId: 7c9da60f-9a68-476b-bcd8-c24da422e80c Version: $LATEST
Got an error retrieving buckets:
operation error S3: ListBuckets, exceeded maximum number of attempts, 3, https response error StatusCode: 0, RequestID: , HostID: , request send failed, Get \"http://localhost:4566/\": dial tcp 127.0.0.1:4566: connect: connection refused
2022/07/28 14:54:10 <nil>
28 Jul 2022 14:54:10,979 [ERROR] (rapid) Init failed error=Runtime exited with error: exit status 1 InvokeID=
END RequestId: 5319d88f-ea30-4a61-adb6-e9ab4a83c17e

即使简单的 go 文件(不是 lambda)中的相同代码可以在 S3 上执行操作,我的 lambda 也无法访问我的 localstack docker 中的 S3 存储桶。 知道问题出在哪里吗?

    标签: go amazon-s3 aws-lambda aws-sam localstack


    【解决方案1】:

    你解决了这个问题吗??我在 localstack 中遇到了同样的问题,但在 AWS 中它可以正常工作

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 2017-02-17
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2017-10-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多