我正在 Visual Studio 2022 的 .NET Core 6 中構建休息服務。該服務使用 dynamodb 作為其資料庫。我在 Docker 中使用單個 docker-compose 檔案運行這兩個檔案。
如果我像這樣在它自己的 docker-compose 檔案中啟動 dynamodb-local
version: '3.4'
services:
dynamodb-local:
image: amazon/dynamodb-local:latest
container_name: dynamodb-local
command: "-jar DynamoDBLocal.jar -sharedDb"
ports:
- "8000:8000"
我像這樣在 Program.cs 中配置客戶端
var clientConfig = new AmazonDynamoDBConfig {ServiceURL = "http://localhost:8000" };
builder.Services.AddSingleton<IAmazonDynamoDB>(_ => new AmazonDynamoDBClient(clientConfig));
如果我從 IIS Express 運行服務,一切都會完美運行。
但是,我為專案啟用了容器化,并希望在 docker 中一起運行所有內容。當我這樣做時,我的 docker-compose 看起來像這樣:
version: '3.4'
services:
dynamodb-local:
image: amazon/dynamodb-local:latest
container_name: dynamodb-local
command: "-jar DynamoDBLocal.jar -sharedDb"
ports:
- "8000:8000"
api:
image: ${DOCKER_REGISTRY-}api
container_name: insurance-service
build:
context: .
dockerfile: src/Api/Dockerfile
depends_on:
- dynamodb-local
然后我的docker-compose-override.yml樣子是這樣的(這是由 VS 生成的):
version: '3.4'
services:
api:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https:// :443;http:// :80
ports:
- "80"
- "443"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro

當我在 VS 2022 中使用 docker-compose 啟動它時,一切正常。但是當我將記錄保存到資料庫時,會引發此錯誤:
Amazon.Runtime.AmazonServiceException:無法從 EC2 實體元資料服務獲取 IAM 安全憑證。
就像注冊的客戶正在嘗試訪問localhost:8000,但那里似乎什么都沒有,所以它默認回傳 EC2 IAM 安全憑證。我認為這是由我沒有意識到的 2 個服務之間的一些奇怪的網路引起的。像 API 無法通過參考 localhost 訪問 dynamodb-local。
編輯:我也嘗試過像這樣在其中扔任意基本信用:
var clientConfig = new AmazonDynamoDBConfig { ServiceURL = "http://localhost:8000" };
var creds = new BasicAWSCredentials("xxx", "xxx");
builder.Services.AddSingleton<IAmazonDynamoDB>(_ => new AmazonDynamoDBClient(creds, clientConfig));
這并沒有給我 IAM 問題,而是一直在無限回圈中嘗試,就像它正在等待 localhost 可用而它不是。
uj5u.com熱心網友回復:
為什么不嘗試在容器之間使用網路?您可以創建一個網路,然后使用容器名稱訪問 DynamoDB,這樣 DynamoDB 容器就可以在內部訪問。
version: '3.4'
services:
dynamodb-local:
image: amazon/dynamodb-local:latest
container_name: dynamodb-local
command: "-jar DynamoDBLocal.jar -sharedDb"
ports:
- "8000:8000"
api:
image: ${DOCKER_REGISTRY-}api
container_name: insurance-service
build:
context: .
dockerfile: src/Api/Dockerfile
depends_on:
- dynamodb-local
networks:
default:
external:
name: dynamodb-api
您可以將 URL 替換為容器名稱,如下所示:
var clientConfig = new AmazonDynamoDBConfig { ServiceURL = "dynamodb-local" };
var creds = new BasicAWSCredentials("xxx", "xxx");
builder.Services.AddSingleton<IAmazonDynamoDB>(_ => new AmazonDynamoDBClient(creds, clientConfig));
您還必須使用此命令創建一個 docker 網路
docker network create dynamodb-api
希望這可以幫助!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/510495.html
標籤:C#码头工人码头工人撰写亚马逊-dynamodb本地发电机
