json - 如何从 AWS API Gateway cloudwatch 日志中获取用户的公共 IP?
问题描述
我正在尝试将用户的公共 IP 地址记录到 AWS API Gateway 中的 CloudWatch 日志中。
我创建了一个名为 SourceIP 的模型,并尝试根据 AWS 官方文档添加以下架构,但它给了我错误。
代码 :
{
"source_ip" : "$context.identity.sourceIp"
}
错误 :
指定的模型无效:验证结果:警告:[],错误:[指定的模型架构无效。不支持的关键字:[“source_ip”]]
我的架构可能有什么问题?
任何帮助将不胜感激。
谢谢。
解决方案
映射模板覆盖不能与缺少数据映射的代理集成端点一起使用
- 模型仅用于表示输入和输出格式
- 用于转换数据的映射模板
您可以按照以下步骤在 API 网关中启用日志记录:
- 创建
arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs
附加权限并遵循信任策略的 IAM
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
- 在
- In the API Gateway console, on the APIs pane, choose the name of an API that you created.
- In the left navigation pane, at the bottom, choose Settings.
- Under Settings, for CloudWatch log role ARN, paste the IAM role ARN that you copied.
- Choose Save.
现在有两种记录 IP 地址的方法
- 在 AWS 控制台中转到您的 AWS API Gateway 实例。在左侧菜单中选择 Stages,然后选择 Logs/Tracing 选项卡 Toggle on
Enable CloudWatch Logs
并选择Log Level
asINFO
接着
这导致访问日志如下:
最重要的是,您还可以Method request headers
在
(b1fe0021-8064-4be8-a548-203c6fd795a6) Method request headers:
{accept-language=en-us, User-Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15,
X-Forwarded-Proto=https,
X-Forwarded-For=8.xx.xx.xx,
Host=xxxxx.execute-api.eu-central-1.amazonaws.com,
X-Forwarded-Port=443, accept-encoding=gzip, deflate, br,
X-Amzn-Trace-Id=Root=1-602e74b0-439e58b379ac537c27664a34, accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8}
如果您不启用CloudWatch
登录,则通过映射模板的地址信息IP
也将被传递到端点。就像这个答案中描述的那样,例如 lambda。
'use strict';
console.log('Loading function');
exports.handler = (event, context, callback) => {
console.log('SourceIP =', event.identity.sourceIP);
callback(null, event.identity.sourceIP);
};
或者
在 AWS 控制台中转到您的 AWS API Gateway 实例。在左侧菜单中选择阶段,然后选择日志/跟踪选项卡切换启用访问日志并将您的 cloudwatch 日志组添加到您要记录的位置。
- 添加 JSON 日志,我还添加了一些 IP 地址。
{
"ip": "$context.identity.sourceIp",
"apiId": "$context.apiId",
"requestId": "$context.requestId",
"requestTime": "$context.requestTime",
"protocol": "$context.protocol",
...
...
}
- 单击保存更改,就是这样!API 日志应在几分钟后开始显示。
如何启用 CloudWatch Logs 以对我的 API Gateway REST API 或 WebSocket API 进行故障排除?
推荐阅读
- php - PHP 导入到 Wordpress 脚本卡在 504Null 错误
- node.js - 仅在刷新页面时令牌过期时注销?为什么?
- c++ - 模板化有序向量和 std::set
- azure - 使用 DevOps 部署 Azure Function
- amazon-dynamodb - 如何使用 AWS Glue 启用对 dynamoDB 表的跨账户访问
- java - 您可以使用一个扫描仪对象来读取多个文件吗?
- awk - 使用主列表交叉引用多个列表以生成缺失值作为 NA 的合并输出
- scikit-learn - GridSearchCV hidden_layer_sizes 参数数组应该是一维的
- nearprotocol - 尝试在附近调用 changemethods 后获取 FinalExecutionOutcome 的交易详细信息
- c++ - OpenGL 错误(#97) 即使着色器正确并成功从文件中读取,也没有找到程序主程序