amazon-web-services - Http 请求标头在 AWS Lambda 中并不总是可用
问题描述
我通过无服务器框架使用 API Gateway 和 AWS Lambda 来创建 API 端点。lambda 函数默认部署为 lambda 代理。
当我向POST
其中一个端点发送请求时,我会包含自定义标头,例如client_version: 1.0.0
.
现在发生了奇怪的事情,即 Lambda 函数client_version
在向端点发出请求时并不总是获取标头。这主要发生在将服务部署到 aws 后几分钟,一段时间后 lambda 函数收到标头。但有时它会收到标头,然后在将来的某个时候它不会再次收到标头。
我测试了从我的机器和在线服务向单个端点发出请求,看起来它是完全独立的。
这意味着我的机器POST
请求可能会发生奇怪的错误,而在线服务POST
请求成功地设法将标头传递给 lambda 函数,或者同时以其他方式传递或两者兼而有之。
这让我发疯,因为我根本不知道问题可能是什么,我需要将自定义标头始终发送到我的端点。任何帮助表示赞赏。
无服务器配置
无服务器.yml:
custom: ${file(serverless_config/custom.yml):custom}
functions: ${file(serverless_config/functions.yml):functions}
resources: ${file(serverless_config/resources.yml):resources}
service: "${self:custom.WEBSERVICE_NAME}"
provider:
name: aws
profile: "${self:custom.CURRENT_PROFILE}"
stage: "${self:custom.CURRENT_DEPLOY_MODE}"
region: "${self:custom.AWS_DEPLOY_REGION}"
runtime: "${self:custom.AWS_LAMBDA_RUNTIME}"
memorySize: ${self:custom.AWS_LAMBDA_MEMORY_SIZE}
timeout: "${self:custom.AWS_LAMBDA_TIMEOUT}"
logRetentionInDays: ${self:custom.AWS_CLOUDWATCH_LOG_TTL}
environment: ${file(serverless_config/environment.yml):environment}
函数.yml
functions:
Account-Create:
role: DefaultLambdaIAMRole
handler: src/v1/Account/Create/Email/main.main
events:
- http:
path: v${self:custom.CURRENT_API_VERSION}/account/create-email
method: POST
自定义.yml:
custom:
WEBSERVICE_NAME: account-service
WEBSERVICE_ENDPOINT: "api.accountservice.testing.galaxgate.com"
DEFAULT_DEPLOY_MODE: dev
stage: "${opt:stage, self:custom.DEFAULT_DEPLOY_MODE}"
CURRENT_DEPLOY_MODE: "${self:custom.stage}"
CURRENT_PROFILE: galaxfinity
CURRENT_API_VERSION: "1"
WEBSERVICE_PREFIX: "${self:custom.WEBSERVICE_NAME}-${self:custom.CURRENT_DEPLOY_MODE}-"
AWS_ACCOUNT_ID: "XXXXXXXXX"
AWS_DEPLOY_REGION: eu-central-1 # dep: _config.js
AWS_LAMBDA_RUNTIME: nodejs12.x
AWS_LAMBDA_TIMEOUT: 30
AWS_LAMBDA_MEMORY_SIZE: 512
IAM_LAMBDA_POLICY_NAME: "${self:custom.WEBSERVICE_PREFIX}policy-lambda"
IAM_LAMBDA_ROLE_NAME: "${self:custom.WEBSERVICE_PREFIX}role-lambda"
AWS_CLOUDWATCH_LOG_TTL: 180 # in days
DB_TABLE_DELETION_POLICY_VALUES:
dev: Delete
prod: Retain
DB_TABLE_DELETION_POLICY: ${self:custom.DB_TABLE_DELETION_POLICY_VALUES.${self:custom.stage}}
S3_BUCKET_DELETION_POLICY_VALUES:
dev: Delete
prod: Retain
S3_BUCKET_DELETION_POLICY: ${self:custom.S3_BUCKET_DELETION_POLICY_VALUES.${self:custom.stage}}
customDomain:
endpointType: 'regional'
securityPolicy: tls_1_2
domainName: '${self:custom.WEBSERVICE_ENDPOINT}'
certificateName: '${self:custom.WEBSERVICE_ENDPOINT}'
basePath: '${self:custom.CURRENT_DEPLOY_MODE}'
stage: ${self:custom.CURRENT_DEPLOY_MODE}
createRoute53Record: true
一些图片
相同的请求导致不同的结果。
更新 1 我能够直接从 API Gateway 输入获取日志。似乎 API Gateway 甚至没有收到自定义标头。仍然无法相信邮递员可能会造成麻烦。
Method request headers: {Accept=*/*, Cache-Control=no-cache, User-Agent=PostmanRuntime/7.24.1, X-Forwarded-Proto=https, X-Forwarded-For=5.147.136.132, Host=api.accountservice.testing.galaxgate.com, Postman-Token=9236b95a-3cef-4e04-a188-38e996122811, Accept-Encoding=gzip, deflate, br, X-Forwarded-Port=443, X-Amzn-Trace-Id=Root=1-5ec30f6a-6e719a6a7cc4e1c12e54c030, Content-Type=text/plain}
更新 2
在这里你可以看到这一切的奇怪之处。我使用 reqbin.com 发送两个请求,一个来自美国服务器,一个来自 DE 服务器。服务器应以PAYLOAD_INVALID
. 但是,当没有设置标头字段时client_version
,它会以CLIENT_VERSION_MISSING
.
从什么时候开始,标题字段在通过 Internet 发送时神秘地消失了?
大最终更新
我找到了解决方案:事实证明,更改自定义标头client_version
可以X-Client-Version
解决问题,并且可以始终如一地接收标头。我不知道为什么这样的事情会影响 API Gateway 的功能,但我对工作解决方案很好。
解决方案
您需要在 cors https://www.serverless.com/framework/docs/providers/aws/events/apigateway#enabling-cors上设置自定义标头
例如:
functions:
hello:
handler: handler.hello
events:
- http:
path: hello
method: get
cors:
origin: '*'
headers:
- Content-Type
- X-Amz-Date
- Authorization
- client_version
allowCredentials: false
推荐阅读
- javascript - 如何在点击导航栏中的相应内容时一一调用多个html页面?
- angular - Visual Studio Code 未找到 Angular 变量的所有引用
- android - 获取 jsonarray api 但不确定何时返回 jsonobject 以及何时返回 jsonarray
- python - python列表到csv文件,每个项目都在新行中
- netlogo - 如果乌龟在那个时刻没有移动,如何观察它?(网标)
- php - 将值连接到另一个模态
- javascript - 带有超时的Vue异步方法
- r - 当列不匹配时如何组合R中的列?
- c - 如何(f)在c中同步linux下的目录
- python - 从 Word 文档中检索字体样式、大小和其他属性