通过Lambda调用AWS PinPoint PutEvents接口时出现NotFoundException报错求助
排查AWS PinPoint PutEvents接口的NotFoundException问题
我来帮你搞定这个报错!结合你的代码和错误信息,咱们从最常见的几个原因一步步排查:
1. 核对Application ID是否完全准确
先仔细检查app_id = '1234abcd'这个值,是不是和PinPoint控制台里项目的完整ID完全一致?有时候复制的时候容易多带空格、漏字符,或者大小写搞错(虽然AWS大部分ID是小写,但也别大意)。建议直接从控制台项目的URL或者概述页复制ID,手动输入容易出错。
2. 确认Lambda与PinPoint项目的区域一致
AWS服务是分区域隔离的,这是最容易踩的坑!如果你的PinPoint项目创建在us-east-1,但Lambda的boto3客户端默认用了其他区域(比如Lambda部署在us-west-2),就会找不到对应的资源。
解决方法:初始化PinPoint客户端时明确指定区域,比如:
# 替换成你的PinPoint项目实际所在区域 client = boto3.client('pinpoint', region_name='us-east-1')
另外也可以检查Lambda的部署区域,确保和PinPoint项目区域相同,或者在Lambda的环境变量里设置AWS_REGION为正确的区域。
3. 验证Lambda执行角色的IAM权限
虽然错误是“Resource not found”,但有时候权限配置不对也可能返回误导性的错误。确保Lambda的执行角色拥有mobiletargeting:PutEvents权限,并且策略的资源范围包含你的PinPoint项目ID。
示例IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "mobiletargeting:PutEvents", "Resource": "arn:aws:mobiletargeting:<你的区域>:<AWS账号ID>:apps/<你的AppID>/*" } ] }
记得把占位符替换成实际的区域、账号ID和AppID。
4. 其他小细节排查
- Endpoint ID格式:你的
test_endpoint符合PinPoint的要求(允许字母、数字、下划线、连字符,最长256字符),这个应该没问题,但如果后续排查完上面的点还报错,可以试试换个简单的ID测试。 - 时间戳格式:你当前用的
isoformat()生成的格式是符合要求的,但可以改成更标准的UTC时间格式:datetime.datetime.utcnow().isoformat() + 'Z',确保时间戳没有时区问题。
修改后的示例代码
这里给你调整了区域指定和时间戳格式的版本,你可以参考:
import boto3 import datetime # 明确指定PinPoint项目所在区域 client = boto3.client('pinpoint', region_name='us-east-1') app_id = '1234abcd' # 务必和控制台的项目ID完全一致 endpoint_id = 'test_endpoint' address = 'test@test.com' def lambda_handler(event, context): response = client.put_events( ApplicationId=app_id, EventsRequest={ 'BatchItem': { endpoint_id: { 'Endpoint': { 'ChannelType': 'EMAIL', 'Address': address, 'Attributes': { 'Cart': ['Hat'], 'Purchased': ['No'] } }, 'Events':{ 'cart-event-2': { 'Attributes':{ 'AddedToCart': 'Hat' }, 'EventType': 'AddToCartEvent', 'Metrics': { 'price': 29.95 }, 'Timestamp': datetime.datetime.utcnow().isoformat() + 'Z' } } } } } ) return response
先优先排查区域和App ID的问题,这两个是导致这个报错最常见的原因!
内容的提问来源于stack exchange,提问作者MarkelleFultz
相关产品推荐
相关产品推荐

