【发布时间】: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