小编Dav*_*ron的帖子

如何为在 EC2 模式下在 AWS ECS 集群中运行的容器分配公共 IP

我正在尝试使用服务之间的服务发现来实现多服务 ECS 集群。我正在尝试按照教程创建使用 Amazon ECS CLI 使用服务发现的 Amazon ECS 服务。但是,它不包括完整的工作示例

我所做的是定义两个服务,通过使用定义:

  • docker-compose.yml
  • ecs-params.yml

我可以轻松调出 ECS 集群和这两个服务。一切看起来都不错。但其中一项服务需要公共 IP 地址。所以在相应的ecs-params.yml文件中,我把assign_public_ip: ENABLED. 但是没有分配公共 IP 地址。在 ECS 控制台中,服务详细信息显示Auto-assign public IP DISABLED为 ,对于任务,它列出了私有 IP 地址,没有公有 IP 地址。

不幸的是,根据网络模式任务网络awsvpc的文档,这似乎是不可能的:

该 awsvpc 网络模式不为使用EC2启动类型任务提供任务ENIS与公网IP地址。要访问 Internet,应在配置为使用 NAT 网关的私有子网中启动使用 EC2 启动类型的任务。有关更多信息,请参阅 Amazon VPC 用户指南 中的 NAT 网关。入站网络访问必须来自使用私有 IP 地址的 VPC 内,或从 VPC 内通过负载均衡器路由。在公共子网中启动的任务无法访问 Internet。

问题:如何解决 AWS ECS EC2 启动类型的这种限制?

我不明白为什么 EC2 启动类型不支持公共 IP 地址?或者 - 我是否使用不同的网络模式,然后分配一个公共 …

amazon-web-services amazon-ecs amazon-vpc aws-nat-gateway

7
推荐指数
1
解决办法
7215
查看次数

使用 target/module=esnext 时相当于 TypeScript 中的 __dirname

我需要计算相对于模块的文件系统位置的路径名。我在 Node.js 12.x 上使用最新的 TypeScript。由于其他原因,tsconfig.json我已设置

        "target": "esnext",
        "module": "esnext",
Run Code Online (Sandbox Code Playgroud)

这会触发一种严格限制 Node.js 对 ES6 模块支持的模式。在该模式下,__dirname变量不可用,因为 ESanything 规范中未定义该全局变量。我们应该做的是访问import.meta.url变量并提取目录名称。

例如,请参阅此问题的最后一个答案:Alternative for __dirname in node when using the --experimental-modules flag

但在 TypeScript DefinedTyped 集合中,ImportMeta 类未定义为包含成员url。因此代码无法编译:

tdn.ts:7:25 - error TS2339: Property 'url' does not exist on type 'ImportMeta'.

7 console.log(import.meta.url);
                          ~~~
Run Code Online (Sandbox Code Playgroud)

我无法在 Definely Typed 存储库中找到 ImportMeta 的定义。但它的定义似乎不恰当。

更新:在node_modules//typescript/lib/lib.es5.d.ts我发现这个:

/**
 * The type of `import.meta`.
 *
 * If you need to declare that a given …
Run Code Online (Sandbox Code Playgroud)

node.js typescript

6
推荐指数
1
解决办法
9247
查看次数

使用 Traefik 或 NGINX 在 Docker Swarm 上正确处理 Socket.io

我正在使用 Socket.IO 在 Node.js 中开发一个应用程序,该应用程序使用 Docker Swarm 进行部署,并且我想要选择应用程序服务的多个实例。但是,当存在多个实例时,应用程序就会失败。该故障涉及浏览器中每个 Socket.IO 消息的错误、​​消息中应发送的数据从未到达等。

Docker Stack文件有四个服务

  • Node.js 应用程序
  • 在多节点 Socket.IO 服务中处理 Socket.IO 和会话所需的 REDIS 实例 - 是的,我已经阅读了有关此内容的 Socket.IO 文档,实现了 SessionStore connect-redis,并用于socket.io-redis执行多节点 Socket.IO
  • 数据库(MySQL)
  • 反向代理 - 我使用过 NGINX 和 Traefik

在 Socket.IO 中,有一个例行的 keepalive 请求,例如 GET 上的请求/socket.io/?EIO=3&transport=polling&t=NLjcKJj&sid=X5UnuTjlYNJ4N8OsAAAH。该请求可在反向代理的日志文件中看到,并由应用程序处理。Engine.IO 的调试输出表明它收到了这些请求。

具体来说:

2020-10-28T05:06:02.557Z Net read redis:6379 id 0
2020-10-28T05:06:02.557Z socket.io:socket socket connected - writing packet
2020-10-28T05:06:02.557Z socket.io:socket joining room X5UnuTjlYNJ4N8OsAAAH
2020-10-28T05:06:02.557Z socket.io:client writing packet {"type":0,"nsp":"/"}
2020-10-28T05:06:02.557Z socket.io:socket joined room [ 'X5UnuTjlYNJ4N8OsAAAH' ]
2020-10-28T05:06:02.656Z …
Run Code Online (Sandbox Code Playgroud)

socket.io docker-swarm traefik nginx-reverse-proxy

5
推荐指数
1
解决办法
4198
查看次数

DynamoDB w / Serverless,使用Fn :: GetRef引用全局二级索引

我有一个用DynamoDB表定义的API /服务。我有几个索引(定义为全局二级索引)来支持几个查询。我设计了具有GSI定义的表,以及看起来像正确的查询的表。但是,在进行查询时出现此异常:

{ AccessDeniedException: User: arn:aws:sts::OBSCURED:assumed-role/chatroom-application-dev-us-east-1-lambdaRole/chatroom-application-dev-getRoomMessages is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:OBSCURED:table/messages-table-dev/index/roomIndex
at Request.extractError (/var/task/node_modules/aws-sdk/lib/protocol/json.js:48:27)
at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/var/task/node_modules/aws-sdk/lib/request.js:683:14)
at Request.transition (/var/task/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/task/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/task/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:685:12)
at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
message: 'User: arn:aws:sts::OBSCURED:assumed-role/chatroom-application-dev-us-east-1-lambdaRole/chatroom-application-dev-getRoomMessages is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:OBSCURED:table/messages-table-dev/index/roomIndex',
code: 'AccessDeniedException',
time: 2018-06-02T22:05:46.110Z,
requestId: 'OBSCURED',
statusCode: 400,
retryable: false,
retryDelay: 30.704899664776054 }
Run Code Online (Sandbox Code Playgroud)

在异常的最上方,它说我的getRoomMessages方法is not authorized to perform: dynamodb:Query on resource:的ARN并显示全局二级索引的ARN。

显然,我需要定义策略以授予访问全局二级索引的权限。但这还不清楚。我已经看到了有关DynamoDB的其他StackOverflow问题,他们抱怨文档零散,很难找到任何东西。我必须同意。“碎片化”一词太温和了。 …

amazon-dynamodb serverless-framework dynamodb-queries aws-serverless

3
推荐指数
2
解决办法
2128
查看次数

DynamoDB查询二级索引,如何定义索引

我一直在四处走动,但不清楚该怎么做。

我有一个简单的表,我想在其中对几列进行查询。据我了解,这意味着为要查询的每一列创建二级索引。我已经使用Serverless框架定义了表,serverless.yml并且收到了各种奇怪的错误消息。

当前的serverless.yml定义是:

resources:
  Resources:
    MessagesDynamoDBTable:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        AttributeDefinitions:
          - AttributeName: messageId
            AttributeType: S
          - AttributeName: room
            AttributeType: S
          - AttributeName: userId
            AttributeType: S
        KeySchema:
          - AttributeName: messageId
            KeyType: HASH
          - AttributeName: userId
            KeyType: RANGE
        LocalSecondaryIndexes:
          - IndexName: roomIndex
            KeySchema: 
              - AttributeName: room
                KeyType: HASH
            Projection: 
              ProjectionType: "KEYS_ONLY"
          - IndexName: userId
            KeySchema: 
              - AttributeName: userId
                KeyType: HASH
            Projection: 
              ProjectionType: "KEYS_ONLY"
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:custom.tableName}
Run Code Online (Sandbox Code Playgroud)

它的意思是类似于Slack服务-因此我想查询房间,用户等的条目。

根据我已经找到的文档,此定义很有意义。一个应该为索引中使用的列声明属性,而我已经这样做了。KeySchema-我确实只需要messageId字段,但是一条错误消息表明它需要RANGE索引,因此我将userId字段添加到KeySchema中只是为了关闭它。根据我已经找到的文档,二级索引字段看起来正确。

有了这个定义,当尝试使用 serverless deploy

An error occurred: …
Run Code Online (Sandbox Code Playgroud)

amazon-dynamodb serverless-framework dynamodb-queries amazon-dynamodb-index

2
推荐指数
1
解决办法
3928
查看次数