Authentication/Cognito SDK 在部署到 AWS Lambda 后无法正常工作

Authentication/Cognito SDK not working once deployed to AWS Lambda

我已将 AWS Cognito 用户池集成到我的应用程序中,如本文所述:http://snevsky.com/blog/dotnet-core-authentication-aws-cognito 使用这些包:AWSSDK.CoreAWSSDK.CognitoIdentityProvider.

在我的开发环境中,它运行良好:我可以调用 AdminInitiateAuthAsync 来验证用户,我可以调用 SignUpAsync 来创建新用户。其他方法也很有效——在我的 dev 环境中。

但是,当我将我的代码部署到 Lambda 时,它不起作用。具体来说,它挂在这条线上:

var response = await cognito.AdminInitiateAuthAsync(request);

最后,我在 CloudWatch 中收到一条错误消息 Task timed out。但是,它没有告诉我为什么。根据我过去使用 Lambda 和 AWS 的经验,我认为这是 Lambda 和 Cognito 之间的权限问题,但这只是一个猜测。

我试过的几件事:

  1. 如文章所述,我添加了两个 dev 环境设置:AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。但是,Lambda 不允许您将这些特定键设置为环境变量。因此,作为测试,我尝试在我的代码中明确设置这些:
var credentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
var region = RegionEndpoint.GetBySystemName("myRegionId");
var cognito = new AmazonCognitoIdentityProviderClient(credentials, region);

  1. 我为 Lambda 执行角色添加了管理员权限。

感谢任何帮助。

几件事:

  1. 您不需要在 lambda 代码中提供 API 密钥。鉴于您的代码实际上在安全沙箱中运行,AWS 会为您代劳。
  2. 您的 Cognito 用户池实际上有一个 public DNS 名称,因此当您向它发出任何 API 请求时(即使通过 AWS SDK),您的流量会通过 public 互联网.这意味着 lambda 应该能够将流量发送到 public 互联网。鉴于您面临 "Task timed out error",此类错误最常见的情况是您将函数放入 VPC,但没有提供 NAT instance/Gateway、路由 table 规则和必要的安全组允许 lambda 与 public 互联网通信。如果您检查您的基础设施设置并最终看到您的 lambda 在 VPC 中,请决定您是否真的需要它在那里。如果你不这样做,把它从那里拿走,很可能你的认知请求会立即起作用。但如果这样做,则必须配置 NAT、安全组和路由 table 记录。