如何让 SAM 监听与 docker-compose.yml 相同的网络?

问题描述 投票:0回答:1

我正在实现一个 AWS lambda,并使用 aws SAM 在本地启动它:

我使用以下

template.yaml

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: >
  TechMate Internal API

Globals:
  Function:
    Timeout: 60

Parameters:
  Table:
    Type: String
    Default: Activities
  Region:
    Type: String
    Default: eu-west-2
  AWSEnv:
    Type: String
    Default: AWS

Resources:
  CreateActivityFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: myapp
      Handler: app.lambda_handler
      Runtime: python3.8
      Environment:
        Variables:
          DYNAMO_DB_REGION: localhost
          DYNAMO_DB_ENDPOINT: http://localhost:8000
          DYNAMO_DB_KEY: local
          DYNAMO_DB_SECRET: local
          CHATBOT_API_KEY: CHATBOT_API_KEY
          CHATBOT_API_SECRET: CHATBOT_API_SECRET
      Events:
        CreateActivities:
          Type: Api
          Properties:
            Path: /
            Method: post
     
  
Outputs:
  ActivitiesApi:
    Description: "API Gateway endpoint URL for Prod stage for Create Activity Function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/activities/"

我使用以下命令来启动它:

sam local start-lambda

但是我的开发环境使用以下配置:

version: "3.8"
name: ${APP_NAME}
services:

  # PHP APPS
  php_app:
    container_name: ${APP_NAME}
    build:
      context: .
      dockerfile: ./dockerfiles/Dockerfile
      args:
        - COMPOSER_VERSION=latest
        - XDEBUG_VERSION=latest
        - PHP_VERSION=8.3
    volumes:
      - "php_app:/var/www/html"
    networks:
      private:
    env_file: env/php.env

  # Supportive services
  
  nginx:
    image: nginx
    networks:
      private:
      public:
        ipv4_address: ${IP_BASE}.2
    volumes:
      - "php_app:/var/www/html"
      - "./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
      - "./ssl/certs/www.crt:/etc/nginx/ssl/www.crt:ro"
      - "./ssl/certs/www.key:/etc/nginx/ssl/www.key:ro"

  # Rest of services Here    

volumes:

  php_app:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ${PHP_APP_PATH}
  

networks:
  private:
  public:
    ipam:
      config:
        - subnet: ${IP_BASE}.0/24
          gateway: ${IP_BASE}.1

如何让 sam 运行 lambda 及其模拟网关来侦听 docker-compose 中的

private
网络?

php docker aws-sam
1个回答
0
投票

我发现没有办法让 sam 监听 docker-compose.yml 上定义的同一网络,但我使用以下步骤遵循了这种方法:

Step1 让 sam 监听所有网络接口

我遵循的方法是在我的主机上运行以下命令:

sam local start-api --host=0.0.0.0

它可以更好地完善,但就我而言,效果很好,我对此很满意。

第2步在docker-compose上定义主机ip

方法1 使用ip或者解析来检测IP
/proc/route

为此,您可以使用 ip 命令:

ip route | grep default | awk '{print $3}'

或者如果使用 php,您也可以使用以下脚本: https://github.com/pc-magas/docker_php_dev/blob/master/utils/get_xdebug_ip

脚本或命令都必须在 docker 容器的INSIDE 中运行。通常我在 docker 的入口点脚本上运行这些命令。

方法 2 使用
host.docker.internal
(较简单的一种)

Docker 桌面允许通过

host.docker.internal
域访问主机监听服务。但在linux上没有定义。

对于您的服务的定义:

    extra_hosts:
      - "host.docker.internal:host-gateway"

API 可通过以下方式访问:

curl host.docker.internal:3000
© www.soinside.com 2019 - 2024. All rights reserved.