Pau*_*bra 18 amazon-web-services amazon-dynamodb docker aws-sam-cli
我已经使用AWS sam本地设置了api gateway/aws lambda对,并确认我可以在运行后成功调用它
sam local start-api
然后我在docker容器中添加了一个本地dynamodb实例,并使用aws cli在其上创建了一个表
但是,将代码添加到lambda以写入我收到的dynamodb实例:
2018-02-22T11:13:16.172Z ed9ab38e-fb54-18a4-0852-db7e5b56c8cd错误:无法写入表:{"message":"connect ECONNREFUSED 0.0.0.0:8000","code":"NetworkingError", "错误号": "ECONNREFUSED", "系统调用": "连接", "地址": "0.0.0.0", "端口":8000, "区": "EU-西-2", "主机名":"0.0 .0.0","retryable":true,"time":"2018-02-22T11:13:16.165Z"}从命令写入事件:{"name":"test","geolocation":"xyz","输入":"createDestination"} END RequestId:ed9ab38e-fb54-18a4-0852-db7e5b56c8cd
我在网上看到你可能需要连接到同一个docker网络,所以我创建了一个网络docker network create lambda-local
并将我的启动命令更改为:
sam local start-api --docker-network lambda-local
和
docker run -v "$PWD":/dynamodb_local_db -p 8000:8000 --network=lambda-local cnadiminti/dynamodb-local:latest
但仍然收到相同的错误
山姆本地打印出来 2018/02/22 11:12:51 Connecting container 98b19370ab92f3378ce380e9c840177905a49fc986597fef9ef589e624b4eac3 to network lambda-local
我正在使用以下方法创建dynamodbclient:
const AWS = require('aws-sdk')
const dynamodbURL = process.env.dynamodbURL || 'http://0.0.0.0:8000'
const awsAccessKeyId = process.env.AWS_ACCESS_KEY_ID || '1234567'
const awsAccessKey = process.env.AWS_SECRET_ACCESS_KEY || '7654321'
const awsRegion = process.env.AWS_REGION || 'eu-west-2'
console.log(awsRegion, 'initialising dynamodb in region: ')
let dynamoDbClient
const makeClient = () => {
dynamoDbClient = new AWS.DynamoDB.DocumentClient({
endpoint: dynamodbURL,
accessKeyId: awsAccessKeyId,
secretAccessKey: awsAccessKey,
region: awsRegion
})
return dynamoDbClient
}
module.exports = {
connect: () => dynamoDbClient || makeClient()
}
Run Code Online (Sandbox Code Playgroud)
并检查dynamodbclient我的代码正在创建节目
DocumentClient {
options:
{ endpoint: 'http://0.0.0.0:8000',
accessKeyId: 'my-key',
secretAccessKey: 'my-secret',
region: 'eu-west-2',
attrValue: 'S8' },
service:
Service {
config:
Config {
credentials: [Object],
credentialProvider: [Object],
region: 'eu-west-2',
logger: null,
apiVersions: {},
apiVersion: null,
endpoint: 'http://0.0.0.0:8000',
httpOptions: [Object],
maxRetries: undefined,
maxRedirects: 10,
paramValidation: true,
sslEnabled: true,
s3ForcePathStyle: false,
s3BucketEndpoint: false,
s3DisableBodySigning: true,
computeChecksums: true,
convertResponseTypes: true,
correctClockSkew: false,
customUserAgent: null,
dynamoDbCrc32: true,
systemClockOffset: 0,
signatureVersion: null,
signatureCache: true,
retryDelayOptions: {},
useAccelerateEndpoint: false,
accessKeyId: 'my-key',
secretAccessKey: 'my-secret' },
endpoint:
Endpoint {
protocol: 'http:',
host: '0.0.0.0:8000',
port: 8000,
hostname: '0.0.0.0',
pathname: '/',
path: '/',
href: 'http://0.0.0.0:8000/' },
_clientId: 1 },
attrValue: 'S8' }
Run Code Online (Sandbox Code Playgroud)
该设置应该有效吗?我如何让他们互相交谈?
----编辑----
基于Twitter对话,值得一提(也许)我可以在CLI和web shell中与dynamodb进行交互
Pau*_*bra 16
非常感谢Heitor Lessa,他在推特上回复了我的一个例子
这指出了我的答案......
dynamodb的docker容器在我的机器上下文中是127.0.0.1(这就是为什么我可以与它交互)
SAM本地的docker容器在我的机器上下文中位于127.0.0.1
但他们并没有在127.0.0.1彼此的背景下
所以:https://github.com/heitorlessa/sam-local-python-hot-reloading/blob/master/users/users.py#L14
指示我将我的连接代码更改为:
const AWS = require('aws-sdk')
const awsRegion = process.env.AWS_REGION || 'eu-west-2'
let dynamoDbClient
const makeClient = () => {
const options = {
region: awsRegion
}
if(process.env.AWS_SAM_LOCAL) {
options.endpoint = 'http://dynamodb:8000'
}
dynamoDbClient = new AWS.DynamoDB.DocumentClient(options)
return dynamoDbClient
}
module.exports = {
connect: () => dynamoDbClient || makeClient()
}
Run Code Online (Sandbox Code Playgroud)
重要的是:
if(process.env.AWS_SAM_LOCAL) {
options.endpoint = 'http://dynamodb:8000'
}
Run Code Online (Sandbox Code Playgroud)
从SAM本地docker容器的上下文中,dynamodb容器通过其名称公开
我的两个启动命令最终为:
docker run -d -v "$PWD":/dynamodb_local_db -p 8000:8000 --network lambda-local --name dynamodb cnadiminti/dynamodb-local
和
AWS_REGION=eu-west-2 sam local start-api --docker-network lambda-local
这里唯一的变化是给dynamodb容器命名
Ell*_*ery 12
如果你在很多开发者的mac上使用sam-local,你应该可以使用
options.endpoint = "http://docker.for.mac.localhost:8000"
或者在较新的docker上安装https://docs.docker.com/docker-for-mac/release-notes/#docker-community-edition-18030-ce-mac59-2018-03-26
options.endpoint = "http://host.docker.internal:8000"
而不是像上面保罗所做的那样做多个命令(但这可能更加平台无关?).
ryn*_*nop 10
其他答案对我来说过于复杂/不清楚。这是我想出的。
docker-compose.yml
请注意网络名称abp-sam-backend
、服务名称dynamo
以及该dynamo
服务正在使用backend
网络。
version: '3.5'
services:
dynamo:
container_name: abp-sam-nestjs-dynamodb
image: amazon/dynamodb-local
networks:
- backend
ports:
- '8000:8000'
volumes:
- dynamodata:/home/dynamodblocal
working_dir: /home/dynamodblocal
command: '-jar DynamoDBLocal.jar -sharedDb -dbPath .'
networks:
backend:
name: abp-sam-backend
volumes:
dynamodata: {}
Run Code Online (Sandbox Code Playgroud)
通过以下方式启动 DyanmoDB 本地容器:
docker-compose up -d dynamo
version: '3.5'
services:
dynamo:
container_name: abp-sam-nestjs-dynamodb
image: amazon/dynamodb-local
networks:
- backend
ports:
- '8000:8000'
volumes:
- dynamodata:/home/dynamodblocal
working_dir: /home/dynamodblocal
command: '-jar DynamoDBLocal.jar -sharedDb -dbPath .'
networks:
backend:
name: abp-sam-backend
volumes:
dynamodata: {}
Run Code Online (Sandbox Code Playgroud)
请注意,我使用的是主机名 alias dynamo
。这个别名是由abp-sam-backend
网络内部的 docker 为我自动创建的。别名只是服务名称。
sam local
sam local start-api -t sam-template.yml --docker-network abp-sam-backend --skip-pull-image --profile default --parameter-overrides 'ParameterKey=StageName,ParameterValue=local ParameterKey=DDBTableName,ParameterValue=local-SingleTable'
Run Code Online (Sandbox Code Playgroud)
请注意,我要sam local
使用abp-sam-backend
在我的docker-compose.yml
我做了一个可以在https://github.com/rynop/abp-sam-nestjs上找到的工作示例(加上一堆其他功能)
SAM
lambci/lambda
在引擎盖下启动一个 docker 容器dynamodb
,例如,如果您有另一个容器托管或您想要连接 lambda 的任何其他服务,那么您应该将两者都在同一网络中
假设 dynamodb (注意--name
,这是现在的端点)
docker run -d -p 8000:8000 --name DynamoDBEndpoint amazon/dynamodb-local
Run Code Online (Sandbox Code Playgroud)
这将导致这样的事情
0e35b1c90cf0....
Run Code Online (Sandbox Code Playgroud)
要知道这是在哪个网络内部创建的:
docker inspect 0e35b1c90cf0
Run Code Online (Sandbox Code Playgroud)
它应该给你类似的东西
...
Networks: {
"services_default": {//this is the <<myNetworkName>>
....
Run Code Online (Sandbox Code Playgroud)
如果您了解您的网络并希望将 docker 容器放在特定网络中,您可以保存上述步骤并在使用--network
option启动容器的同时在一个命令中执行此操作
docker run -d -p 8000:8000 --network myNetworkName --name DynamoDBEndpoint amazon/dynamodb-local
Run Code Online (Sandbox Code Playgroud)
重要提示:您的 lambda 代码现在应该具有 dynamo 的端点DynamoDBEndpoint
比如说:
if(process.env.AWS_SAM_LOCAL) {
options.endpoint = 'http://DynamoDBEndpoint:8000'
}
Run Code Online (Sandbox Code Playgroud)
测试一切:
使用 lambci:lambda
这应该只列出其他 dynamodb 容器中的所有表
docker run -ti --rm --network myNetworkName lambci/lambda:build-go1.x \
aws configure set aws_access_key_id "xxx" && \
aws configure set aws_secret_access_key "yyy" && \
aws --endpoint-url=http://DynamoDBEndpoint:4569 --region=us-east-1 dynamodb list-tables
Run Code Online (Sandbox Code Playgroud)
或者调用一个函数:(Go Example,同 NodeJS)
#Golang
docker run --rm -v "$PWD":/var/task lambci/lambda:go1.x handlerName '{"some": "event"}'
#Same for NodeJS
docker run --rm -v "$PWD":/var/task lambci/lambda:nodejs10.x index.handler
Run Code Online (Sandbox Code Playgroud)
可以在此处找到有关 lambdaci/lambda 的更多信息
使用SAM
(使用相同的容器lmabci/lambda
):
sam local invoke --event myEventData.json --docker-network myNetworkName MyFuncName
Run Code Online (Sandbox Code Playgroud)
--debug
如果您想查看更多详细信息,您可以随时使用选项。
或者,您也可以http://host.docker.internal:8000
轻松使用 docker,此 URL 是内部保留的,可让您访问主机,但请确保在启动 dynamodb 容器时公开端口 8000。虽然它很容易,但它并不适用于所有操作系统。有关此功能的更多详细信息,请查看docker 文档
归档时间: |
|
查看次数: |
9350 次 |
最近记录: |