gpt4 book ai didi

amazon-web-services - 在 Golang Fargate 任务中访问 DynamoDB

转载 作者:行者123 更新时间:2023-12-03 02:23:32 31 4
gpt4 key购买 nike

我正在尝试从我的 Fargate 任务访问 DynamoDB,该任务是用 golang 编写的。我得到的只是超时。我缺少什么?

我正在使用 AWS 实验室的 Cloudformation 模板 (here)加上允许完全 DynamoDB 访问的任务角色。这是最简单的公有子网模板加上 Fargate 模板。

我尝试添加 VPC 终端节点,但没有任何区别。

在我的机器上运行该任务是有效的。在本地和 AWS 上运行具有(或多或少)相同功能的 Python (Flask) 任务。这是相同的设置,我只是更改了任务图像。

这是代码:

package main

import (
"context"
"fmt"
"github.com/aws/aws-sdk-go-v2/aws/endpoints"
"github.com/aws/aws-sdk-go-v2/aws/external"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/gin-gonic/gin"
"time"
)

var db *dynamodb.Client

func init() {
cfg, err := external.LoadDefaultAWSConfig()
if err != nil {
panic("unable to load SDK config, " + err.Error())
}
cfg.Region = endpoints.UsEast2RegionID
db = dynamodb.New(cfg)
}

func main() {
fmt.Println("go!")
router := gin.New()
router.Use(gin.Recovery())
router.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{"msg": "pong"}) })
router.GET("/pong", func(c *gin.Context) {
req := db.ListTablesRequest(&dynamodb.ListTablesInput{})
ctx := context.Background()
ctx, cancelFn := context.WithTimeout(ctx, time.Second*5)
defer cancelFn()
res, err := req.Send(ctx)
if err != nil {
c.JSON(400, gin.H{"msg": "Fail", "error": err.Error()})
return
}
c.JSON(200, gin.H{"msg": fmt.Sprint(res)})
return
})
router.Run()
}

超时:

helles:v2> curl  xyz.us-east-2.elb.amazonaws.com/pong
{"error":"RequestCanceled: request context canceled\ncaused by: context deadline exceeded","msg":"Fail"}

预期:

helles:v2> curl 127.0.0.1:8080/pong
{"msg":"{\n TableNames: [\"OneTable\",\"OtherTable\"]\n}"}

Python 进行比较:

#!/usr/bin/env python3
from flask import Flask
import boto3

dynamodb = boto3.client("dynamodb")
app = Flask(__name__)

@app.route("/ping")
def index():
return "pong"

@app.route("/pong")
def pong():
return dynamodb.list_tables()

if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=8080)

结果有点不同,添加了元数据,但表名称在那里。

谢谢

最佳答案

回答我自己的问题。

问题出在我使用的 Docker 基础镜像上。我的 Dockerfile 是:

FROM scratch
ADD ./build/api/api /
EXPOSE 8080
ENTRYPOINT ["/api"]

具有静态链接的可执行文件。

从头开始更改为FROM gcr.io/distroless/base使其工作。

我的猜测是,如果没有基础镜像中缺失的部分,应用程序/dynamodb 客户端无法解析服务地址。

谢谢@Dude0001。

关于amazon-web-services - 在 Golang Fargate 任务中访问 DynamoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58193300/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com