亚马逊AWS官方博客

Amazon Cognito集成微信登录部署系列(二)用Lambda开发服务端API

在上一篇中我们介绍了Amazon Cognito集成微信登录的整体架构,开始使用Eclipse开发Lambda函数。在这一篇中我们开始服务端API的整体开发。

后端API开发

我们先实现验证用户的后端API接口。从创建Lambda函数开始。

使用Eclipse来开发Lambda函数

我们使用Eclipse来开发使用 Java 语言的 Lambda 函数。

先在IAM中创建一个管理Lambda函数的IAM用户,并为其创建访问ID和密钥。

注意:为保证安全,建议根据最小权限原则配置这个profile的IAM用户,请仅赋予其管理Lambda等服务的最小权限,而不要直接使用root用户。

安装AWS Toolkit for Eclipse

安装AWS Toolkit for Eclipse,请参考以下文档。

http://docs.thinkwithwp.com/AWSToolkitEclipse/latest/ug/tke_setup.html

由于AWS中国的区域和全球的区域是隔离的,IAM用户也是隔离的,所以管理由西云数据运营的AWS中国(宁夏)区域和由光环新网运营的AWS中国(北京)区域的AWS资源,需要在AWS Toolkit 中默认的Global Configuration外再创建一个仅给由光环新网运营的AWS中国(北京)区域使用的配置

安装好AWS Toolkit之后,我们新建工程时就可以选择AWS Lambda Java Project了。

创建AWS Lambda Java工程


项目名称我们输入CognitoWechat。Group ID输入cn.amazonaws.lambda,Artifact ID输入cognitowechat。Class Name输入AuthenticateUser。Input Type选 Custom。点击Finish按钮。

首次使用时可能会下载Maven等依赖包,请耐心等待。创建完成之后默认会打开README.html文件。把它关闭,我们只留下AuthenticateUser.java这个文件。

发布Lambda函数

发布Lambda函数代码前,我们还有几项准备工作要做。

  1. 准备好Lambda函数的IAM角色。这个Lambda函数需要读写保存着用户ID和微信用户关联关系的DynamoDB表,以及可以调用Amazon Cognito获取OpenIdTokenForDeveloperIdentity。所以我们创建一个IAM服务角色 CognitoWechat_Lambda_Execution。给它赋予AWSLambdaBasicExecutionRole这个托管策略,再加上一个内联策略,可以读取之前我们创建的表WechatUser,以及可以调用Cognito身份池的OpenIdTokenForDeveloperIdentity。
{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Sid": "VisualEditor0",

            "Effect": "Allow",

            "Action": [

                "dynamodb:GetItem"

            ],

            "Resource": [

                "arn:aws-cn:dynamodb:cn-north-1:123456789012:table/WechatUser"

            ]

        },

        {

            "Sid": "VisualEditor1",

            "Effect": "Allow",

            "Action": [

                "cognito-identity:GetOpenIdTokenForDeveloperIdentity"

            ],

            "Resource": [

                "arn:aws-cn:cognito-identity:cn-north-1:123456789012:identitypool/cn-north-1:12345678-90ab-cdef-1234-567890abcdef"

            ]

        }

    ]

}
  1. 创建或选择一个发布Lambda代码时用于临时保存代码包的Amazon S3桶。

在工程的右键菜单找到 Amazon Web Services,再点选 Upload Function to AWS Lambda…。

在弹出的上传函数向导中,Select the Handler已经默认选中现在我们唯一的一个带Lmbda函数的类名。Select the AWS Region选择 China(Beijing),Create a new Lambda function: 输入函数名“CognitoWechat”。

下一步,我们自己输入一些函数的描述,IAM Role 那里已经默认选中了我们前面创建的角色。然后在S3 bucket选择好用于代码发布的桶。其它都保持默认,点击Finish按钮即可。

注:在本文撰写时AWS Toolkit for Eclipse尚未支持 Java 11,上传Lambda代码时会失败。解决方法是操作系统安装的Java改为Java 8。

测试运行Lambda函数

上传完成后,在工程右键菜单找到 Amazon Web Services,再点选 Run Function to AWS Lambda…。在弹出的运行对话框中,选择 Lambda Hanlder已经默认选中现在唯一一个Handler方法,JSON输入格现在什么都不用填,我们只是测试一下到目前为上的Lambda函数空壳能够正常运行。

我们在Eclipse Console面板可以看到函数输出了Hello from Lambda!,即上述Handler方法的返回内容。到此也可验证AWS Toolkit已经正常配置并可以使用。

小结

这一篇中我们介绍了Eclipse配置Lambda开发环境,使用AWS Toolkit开始动手开发Java的Lambda函数。在下一篇中,我们将继续为大家以代码介绍Lambda函数如何处理来自API Gateway的输入参数、响应给API的返回结果。

 

索引

Amazon Cognito 集成微信登录部署系列(一)Cognito身份池、Dynamodb表和创建Lambda函数
Amazon Cognito集成微信登录部署系列(二)用Lambda开发服务端API
Amazon Cognito 集成微信登录部署系列(三)与 API Gateway 集成、处理输入参数、返回响应结果
Amazon Cognito 集成微信登录部署系列(四)实现验证逻辑、发布 API
Amazon Cognito 集成微信登录部署系列(五)客户端集成 Cognito 验证

本篇作者

薛峰

亚马逊AWS解决方案架构师,AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内和全球的应用和推广,在大规模并发应用架构、移动应用以及无服务器架构等方面有丰富的实践经验。在加入AWS之前曾长期从事互联网应用开发,先后在新浪、唯品会等公司担任架构师、技术总监等职位。对跨平台多终端的互联网应用架构和方案有深入的研究。