亚马逊AWS官方博客

AWS Lambda 配合 Jenkins 实现自动化持续部署

AWS Lambda是AWS无服务器框架中的重要组成部分,而开发、测试和部署Lambda函数需要经过一个较为枯燥的过程:在集成开发环境(IDE)中编写函数,然后将其打包,并上传到AWS使用控制台进行测试。事实上,您可以在本地进行编写测试,并将其上传到自己的代码库,然后使用CICD(Continuous Integration/Continuous Development)工具来进行集成部署。

本文中将介绍如何使用Jenkins在AWS上进行Lambda开发部署。更多有关AWS Lambda 介绍可参考链接https://amazonaws-china.com/lambda/

架构图

  1. 通过git命令提交代码
  2. 通过部署在EC2中的Jenkins拉取Github上的代码
  3. 将代码部署到Lambda,完成代码部署
  4. 上传一张图片到S3
  5. 触发S3的ObjectCreate事件,调用Lambda生成缩略图
  6. 将生成的缩略图储存到指定位置

创建Lambda

从控制台进入Lambda,选择从头开始创作

  • 输入Lambda名称
  • 选择从模板创建新角色
  • 点击创建函数
  • 记录已创建Lambda函数的 ARN,位于Lambda函数右上角

修改处理程序为CreateThumbnail.handler

创建S3存储桶

从控制台进入S3创建存储桶,输入自定义桶名,这边需要创建两个存储桶,一个是源数据桶,另一个是目标数据桶

源存储桶

目标桶


进入源存储桶,并选中属性标签

选中高级设置中的事件,按照以下顺序依次操作并保存

  • 添加通知
  • 输入名称
  • 配置事件类型,及Lambda函数

修改Lambda角色

在之前的Lambda函数创建的过程中,自动创建了一个Lambda角色,但是这个角色只有最基本的创建CloudWatch Logs的权限,还需要对创建的S3存储桶有相应的进行读写的权限。

首先获取S3存储桶ARN,选中存储桶,点击复制存储桶ARN

从控制台进入IAM,选中角色,找到在Lambda里创建的新角色,点击附加策略

在搜索栏中输入S3,选中AmazonS3FullAccess并附加(在此案例中)

Jenkins 环境 – Java 8

下载并解压Java 8

wget http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.tar.gz
tar -zxvf jdk-8u151-linux-x64.tar.gz

创建Java目录,并将Java移动至此目录

sudo mkdir -p /usr/local/java/jdk1.8
sudo mv jdk1.8.0_151/* /usr/local/java/jdk1.8/

配置环境变量

sudo vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8
export JRE_HOME=/usr/local/java/jdk1.8/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME
source /etc/profile

配置软连接

sudo rm -rf /usr/bin/java
sudo ln -s /usr/local/java/jdk1.8/bin/java /usr/bin/java

Jenkins 环境 – Jenkins,Git和Nginx

使用私有密钥连接到实例,更新仓库并安装Nginx和Jenkins

sudo yum update -y
sudo yum install -y nginx git

在Amazon Linux上安装Jenkins,需要添加Jenkins 仓库并从这里开始安装Jenkins.

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install -y jenkins

编辑Nginx 配置文件(/etc/nginx/nginx.conf) 并修改服务器配置:

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

启动Jenkins和Nginx服务

service jenkins start

如果出现以下错误

sudo vim /etc/init.d/jenkins

修改配置文件

candidates="
#/etc/alternatives/java
/usr/bin/java
#/usr/lib/jvm/java-1.8.0/bin/java
#/usr/lib/jvm/jre-1.8.0/bin/java
#/usr/lib/jvm/java-1.7.0/bin/java
#/usr/lib/jvm/jre-1.7.0/bin/java
"

service nginx start
chkconfig jenkins on
chkconfig nginx on

Jenkins 环境 – 配置Jenkins

输入EC2 的公有DNS

通过以下命令找到初始密码

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

安装推荐插件

配置用户

安装AWS Lambda Plugin,NodeJS Plugin

在Available标签页搜索并安装

安装完成后,进入Manage Jenkins -> Global Tool Configuration页面,找到Node.JS

接下来需要配置AWS CLI,并调用以下命令确认

aws configure

Jenkins 环境 – 创建Jenkins build

创建名称

输入Repository URL: https://github.com/LiArthur/create-thumbnails-lambda.git

配置触发器

配置运行环境

添加Build step

选择Excute shell,输入以下内容

npm install
grunt lambda_package
aws lambda update-function-code --function-name <Lambda ARN> --zip-file fileb://dist/create-thumbs-lambda_0-0-3_latest.zip --region cn-north-1

保存配置并测试

点击Console Output查看构建日志

构建成功!

当我们的Lambda部署成功之后,便可以开始测试Lambda的功能了。

进入源存储桶并上传一张图片

点击上传后进入目标存储桶便可以看到新生成的图片,如果没有看到可以稍等片刻,再点击刷新按钮刷新

将图片下载下来可以看到,原图和缩略图的大小比较

 

作者介绍

李亚斯,AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,毕业于同济大学软件工程专业,毕业后直接加入亚马逊AWS中国。熟悉多种编程语言,有数年的C语言经验,在移动开发,IoT等方面有丰富的经验。