Skip to content

aws lambda  #16

Open
Open
@fuzhengwei

Description

@fuzhengwei
package main

import (
	"context"
	"crypto/tls"
	"io/ioutil"
	"net/http"
	"net/url"
	"os"
	"strings"
	"time"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

var (
	target    = "https://api.openai.com" // 目标域名
	httpProxy = "http://127.0.0.1:10809" // 本地代理地址和端口
)

func HandleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
	// 过滤无效URL
	_, err := http.NewRequest(request.HTTPMethod, request.Path, nil)
	if err != nil {
		return events.APIGatewayProxyResponse{StatusCode: http.StatusInternalServerError}, err
	}

	// 去掉环境前缀(针对腾讯云,如果包含的话,目前我只用到了test和release)
	newPath := strings.Replace(request.Path, "/openai-go", "", 1)
	newPath = strings.Replace(newPath, "/default", "", 1)

	// 拼接目标URL
	targetURL := target + newPath

	// 创建代理HTTP请求
	proxyReq, err := http.NewRequest(request.HTTPMethod, targetURL, strings.NewReader(request.Body))
	if err != nil {
		return events.APIGatewayProxyResponse{StatusCode: http.StatusInternalServerError}, err
	}

	// 将原始请求头复制到新请求中
	for headerKey, headerValues := range request.Headers {
		for _, headerValue := range headerValues {
			proxyReq.Header.Add(headerKey, string(headerValue))
		}
	}

	// 默认超时时间设置为60s
	client := &http.Client{
		Timeout: 60 * time.Second,
	}

	// 本地测试通过代理请求 OpenAI 接口
	if os.Getenv("ENV") == "local" {
		proxyURL, _ := url.Parse(httpProxy) // 本地HTTP代理配置
		client.Transport = &http.Transport{
			Proxy:           http.ProxyURL(proxyURL),
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
		}
	}

	// 向 OpenAI 发起代理请求
	resp, err := client.Do(proxyReq)
	if err != nil {
		return events.APIGatewayProxyResponse{StatusCode: http.StatusInternalServerError}, err
	}
	defer resp.Body.Close()

	// 将响应头复制到代理响应头中
	responseHeaders := make(map[string]string)
	for key, values := range resp.Header {
		var headerValue string
		for _, value := range values {
			headerValue += value + ","
		}
		responseHeaders[key] = strings.TrimSuffix(headerValue, ",")
	}

	// 读取响应实体到字节数组中
	responseBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return events.APIGatewayProxyResponse{StatusCode: http.StatusInternalServerError}, err
	}

	// 返回API Gateway响应
	return events.APIGatewayProxyResponse{
		StatusCode: resp.StatusCode,
		Headers:    responseHeaders,
		Body:       string(responseBody),
	}, nil
}

func main() {
	lambda.Start(HandleRequest)
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions