亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號