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.Core 和 AWSSDK.CognitoIdentityProvider.
在我的开发环境中,它运行良好:我可以调用 AdminInitiateAuthAsync
来验证用户,我可以调用 SignUpAsync
来创建新用户。其他方法也很有效——在我的 dev 环境中。
但是,当我将我的代码部署到 Lambda 时,它不起作用。具体来说,它挂在这条线上:
var response = await cognito.AdminInitiateAuthAsync(request);
最后,我在 CloudWatch 中收到一条错误消息 Task timed out
。但是,它没有告诉我为什么。根据我过去使用 Lambda 和 AWS 的经验,我认为这是 Lambda 和 Cognito 之间的权限问题,但这只是一个猜测。
我试过的几件事:
- 如文章所述,我添加了两个 dev 环境设置:
AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
。但是,Lambda 不允许您将这些特定键设置为环境变量。因此,作为测试,我尝试在我的代码中明确设置这些:
var credentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
var region = RegionEndpoint.GetBySystemName("myRegionId");
var cognito = new AmazonCognitoIdentityProviderClient(credentials, region);
- 我为 Lambda 执行角色添加了管理员权限。
感谢任何帮助。
几件事:
- 您不需要在 lambda 代码中提供 API 密钥。鉴于您的代码实际上在安全沙箱中运行,AWS 会为您代劳。
- 您的 Cognito 用户池实际上有一个 public DNS 名称,因此当您向它发出任何 API 请求时(即使通过 AWS SDK),您的流量会通过 public 互联网.这意味着 lambda 应该能够将流量发送到 public 互联网。鉴于您面临 "Task timed out error",此类错误最常见的情况是您将函数放入 VPC,但没有提供 NAT instance/Gateway、路由 table 规则和必要的安全组允许 lambda 与 public 互联网通信。如果您检查您的基础设施设置并最终看到您的 lambda 是 在 VPC 中,请决定您是否真的需要它在那里。如果你不这样做,把它从那里拿走,很可能你的认知请求会立即起作用。但如果这样做,则必须配置 NAT、安全组和路由 table 记录。
我已将 AWS Cognito 用户池集成到我的应用程序中,如本文所述:http://snevsky.com/blog/dotnet-core-authentication-aws-cognito 使用这些包:AWSSDK.Core 和 AWSSDK.CognitoIdentityProvider.
在我的开发环境中,它运行良好:我可以调用 AdminInitiateAuthAsync
来验证用户,我可以调用 SignUpAsync
来创建新用户。其他方法也很有效——在我的 dev 环境中。
但是,当我将我的代码部署到 Lambda 时,它不起作用。具体来说,它挂在这条线上:
var response = await cognito.AdminInitiateAuthAsync(request);
最后,我在 CloudWatch 中收到一条错误消息 Task timed out
。但是,它没有告诉我为什么。根据我过去使用 Lambda 和 AWS 的经验,我认为这是 Lambda 和 Cognito 之间的权限问题,但这只是一个猜测。
我试过的几件事:
- 如文章所述,我添加了两个 dev 环境设置:
AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
。但是,Lambda 不允许您将这些特定键设置为环境变量。因此,作为测试,我尝试在我的代码中明确设置这些:
var credentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
var region = RegionEndpoint.GetBySystemName("myRegionId");
var cognito = new AmazonCognitoIdentityProviderClient(credentials, region);
- 我为 Lambda 执行角色添加了管理员权限。
感谢任何帮助。
几件事:
- 您不需要在 lambda 代码中提供 API 密钥。鉴于您的代码实际上在安全沙箱中运行,AWS 会为您代劳。
- 您的 Cognito 用户池实际上有一个 public DNS 名称,因此当您向它发出任何 API 请求时(即使通过 AWS SDK),您的流量会通过 public 互联网.这意味着 lambda 应该能够将流量发送到 public 互联网。鉴于您面临 "Task timed out error",此类错误最常见的情况是您将函数放入 VPC,但没有提供 NAT instance/Gateway、路由 table 规则和必要的安全组允许 lambda 与 public 互联网通信。如果您检查您的基础设施设置并最终看到您的 lambda 是 在 VPC 中,请决定您是否真的需要它在那里。如果你不这样做,把它从那里拿走,很可能你的认知请求会立即起作用。但如果这样做,则必须配置 NAT、安全组和路由 table 记录。