为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang Fargate 任务中访问 DynamoDB

在 Golang Fargate 任务中访问 DynamoDB

Go
慕田峪9158850 2023-07-26 17:27:28
我正在尝试从我的 Fargate 任务访问 DynamoDB,该任务是用 golang 编写的。我得到的只是超时。我缺少什么?我使用 AWS 实验室的 Cloudformation 模板以及允许完全 DynamoDB 访问的任务角色。它是最简单的公有子网模板加上 Fargate 模板。我尝试添加 VPC 终端节点,但没有什么区别。在我的机器上运行该任务是有效的。在本地和 AWS 上运行具有(或多或少)相同功能的 Python (Flask) 任务。这是相同的设置,我只是更改了任务图像。这是代码:package mainimport (    "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.Clientfunc 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 python3from flask import Flaskimport boto3dynamodb = 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)结果有点不同,添加了元数据,但表名称在那里。
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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


FROM scratch

ADD ./build/api/api /

EXPOSE 8080

ENTRYPOINT ["/api"]

使用静态链接的可执行文件。


改变FROM scratch以FROM gcr.io/distroless/base使其发挥作用。


我的猜测是,应用程序/dynamodb 客户端无法在没有基本映像缺失部分的情况下解析服务地址。



查看完整回答
反对 回复 2023-07-26
?
慕标5832272

TA贡献1966条经验 获得超4个赞

超时通常是网络问题。您是否检查了 ECS 任务和 Dynamo DB 使用的安全组。需要确保您已设置规则,以便在正确的端口上从 ECS 传出并进入 DynamoDB。

您说您在 VPC 中为 Dynamo 设置了一个终端节点。您的 OP 不清楚您是尝试连接到私有 VPC 中的私有端点还是尝试通过公共互联网。如果您尝试通过公共互联网,您还需要检查您的 ECS 任务是否位于具有通往公共互联网的 NAT 网关的 VPC 中。您似乎正在尝试通过 127.0.0.1 或 ELB DNS 连接到 DynamoDB 服务,这对我来说没有意义。


查看完整回答
反对 回复 2023-07-26
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信