在AWS DevOps工具的第2部分中,我们了解了如何使用CodeBuild服务使用Maven构建J2EE项目。
在本教程中,我们将看到如何使用CodeDeploy服务将存储在S3存储桶中的工件WAR文件用于部署到Tomcat应用程序服务器。
AWS CodeDeploy是一种部署服务,可自动将应用程序部署到Amazon EC2 Linux或Windows实例。
本教程还将说明如何将Jenkins与CodeDeploy集成。
先决条件:
- 在AWS上最好使用免费套餐。
- 良好和快速的互联网连接。
- 使用的AWS地区–亚太地区(新加坡)。
- Amazon Linux或RHEL EC2实例。
- 在EC2实例上安装了Tomcat。
注意:为了部署内容,CodeDeploy服务不支持AWS CodeCommit存储库。仅支持S3和GitHub。
设置CodeDeploy
AWS CodeDeploy将需要与两个实体一起工作,以访问EC2实例和存储工件(WAR文件)以进行部署的S3存储桶。为了为CodeDeploy服务提供访问这些IAM的权限,将需要设置角色。没有为IAM用户定义IAM角色,但他们只能访问实体。
#1)为CodeDeploy服务创建访问EC2实例的第一个角色。
启动IAM,然后单击角色->创建角色。
在AWS Service下,单击EC2->选择您的用例-> EC2,然后单击Next->权限。
在策略名称下选择AWSCodeDeployRole,然后单击下一步- >审查。
输入角色名称,然后单击创建角色。
最后,编辑此角色的信任关系,以确保可以整体或特定区域/端点访问CodeDeploy服务。
单击角色,然后更新信任关系,如下所示。
在策略中,将EC2更改为Codedeploy,然后单击“更新信任策略”。
2)使用CodeDeploy服务为EC2实例创建第二个角色,以访问S3存储桶。
为此角色重复上述步骤,然后输入以下内容:
- 转到IAM->角色->创建角色。
- 在AWS Service下,选择EC2。
- 在该目录下,再次选择您的用例,然后单击EC2,然后单击按钮下一步- >权限。
- 在附加权限策略屏幕中,选择AmazonS3ReadOnlyAccess,然后单击按钮下一步- >审阅。
- 将角色命名为HW-Codedeploy-EC2-S3,然后单击“创建角色”。
这两个角色现在都应该可用。
启动Amazon Linux EC2实例
在本节中,我们现在配置EC2实例。
在配置实例时,请确保在“配置实例详细信息”步骤中选择角色HW-Codedeploy-EC2-S3。另外,确保打开端口8080。
与此同时,我们还需要安装CodeDeploy代理和Tomcat作为应用程序服务器,以用于部署应用程序。
#1)在Amazon Linux实例上安装和配置CodeDeploy代理
CodeDeploy代理有助于部署,必须在将要进行部署的每个实例(环境)中安装。
登录到Linux实例并根据所使用的区域下载代理。在我们的示例中,标识符为ap-southeast-1的是新加坡地区。
下载代理的命令将采用以下格式:
wget https://aws-codedeploy-<region-identifier>.s3.amazonaws.com/latest/install
#2)在EC2实例上安装Tomcat
- 要安装和运行Tomcat,请按顺序执行以下步骤。
yum install tomcat7 tomcat7-webapps tomcat7-docs-webapp tomcat7-admin-webapps
- 为应用程序管理器启用tomcat用户。进行如/etc/tomcat7/tomcat-users.xml文件中所示的更改
- 最后,启动Tomcat服务。
service tomcat7 start
- 启动Tomcat Web应用程序管理器,并使用URL http://<EC2-Instance>:8080/manager 来检查是否工作。
将AWS CodeDeploy与S3集成
如第2部分所述,CodeDeploy仅支持S3和GitHub作为代码存储库,用于部署应用程序的最新版本。由于我们的应用程序WAR文件存储在S3存储桶中,因此我们需要确保维护的格式是ZIP文件。
这意味着WAR文件应该位于ZIP文件中,这是使用CodeDeploy的部署过程所支持的。
- 还需要在Linux实例上安装AWS CLI(命令行界面)。
- 在Linux实例中运行以下步骤,以从S3存储桶下载WAR。通常需要在构建机器上完成以下步骤。
set AWS_ACCESS_KEY_ID=<Set the access key of the IAM user>
set AWS_SECRET_ACCESS_KEY=<Set the secret key of the IAM user>
set AWS_DEFAULT_REGION=ap-southeast-1
cd /opt/niranjan
aws s3 cp s3://hwcodebuildbucket/HWJavaWebTarget/target/AWS-HelloWorld-1.0.0.war /opt/niranjan
- CodeDeploy使用appspec.yml文件,其中包含对EC2实例的部署说明。该文件必须位于下载应用程序WAR文件的文件夹的根目录中。
创建appspec.yml文件和scripts文件夹,如下所示:
在部署期间,事件按以下顺序运行。
#1)应用程序停止
#2)安装前
#3)安装(调用文件部分并复制WAR文件)
#4)ApplicationStart
- 使用的文件夹层次结构是
/opt/niranjan
appspec.yml
AWS-HelloWorld-1.0.0.war
scripts
start_application
stop_application
uninstall_war_file
- 脚本内容
stop_application:
curl –user tomcat:tomcat http://ec2-54-169-56-238.ap-southeast-1.compute.amazonaws.com:8080/manager/text/stop?path=/AWS-HelloWorld-1.0.0
start_application:
curl –user tomcat:tomcat http://ec2-54-169-56-238.ap-southeast-1.compute.amazonaws.com:8080/manager/text/start?path=/AWS-HelloWorld-1.0.0
uninstall_war_file
rm -rf /var/lib/tomcat7/webapps/AWS-HelloWorld-1.0.0.war
rm -rf /var/lib/tomcat7/webapps/AWS-HelloWorld-1.0.0
对内容进行ZIP处理,然后将ZIP文件上传到S3存储桶。确保在存储桶上启用了“版本控制”。
zip –r AWS-HelloWorld-1.0.0.war.zip AWS-HelloWorld-1.0.0.war appspec.yml scripts
aws s3 cp /opt/niranjan/AWS-HelloWorld-1.0.0.war.zip
s3://hwcodebuildbucket/HWJavaWebTarget/target/AWS-HelloWorld-1.0.0.war.zip
在以下截图中看到上传到S3存储桶的ZIP文件:
您可以创建一个可执行脚本,然后将上述命令添加到该脚本中,并在每次有新的应用程序WAR文件从构建中运行时运行它,而不用一个个地运行命令。
创建CodeDeploy应用程序
创建CodeDeploy应用程序是为了确保WAR文件的正确修订版被部署到适当的环境(即EC2实例)中。
启动CodeDeploy服务,然后单击“创建应用程序”按钮。
输入应用程序名称,部署组(示例: QA-Env),然后选择正在运行的EC2实例。
在表单末尾,选择服务角色。这是本教程前面创建的另一个角色。
单击创建应用程序按钮。
选择部署组(QA-Env),然后选择操作->部署新修订版。
由于ZIP文件位于S3存储桶中,因此请按照以下步骤输入修订位置:
s3://hwcodebuildbucket/HWJavaWebTarget/target/AWS-HelloWorld-1.0.0.war.zip
单击部署按钮。部署成功,如下所示。
WAR文件已成功复制到tomcat webapps目录。
浏览应用程序URL,以确保成功部署了该应用程序。
Jenkins与AWS CodeDeploy的集成
正如我们在前2个教程中看到的那样,Jenkins与AWS DevOps工具很好地集成在一起。要将Jenkins与CodeDeploy集成,需要安装插件。单击此处 下载并安装CodeDeploy插件。
首先在Jenkins-> Configuration中输入IAM用户的访问和密钥。
可以看到示例Jenkins Job配置作为后构建操作步骤的一部分,如下所示:
结论
到目前为止,我们已经了解了如何使用CodeDeploy将存储在S3存储桶中的J2EE应用程序WAR文件自动部署到运行tomcat应用程序服务器的EC2实例。
这三个工具系列(即CodeCommit,CodeBuild和CodeDeploy)可在DevOps的持续集成和持续交付方面提供帮助。与这三个工具一起,AWS CodePipeline是另一种工具,可帮助端到端可视化应用程序交付。