使用CodeDeploy在GitHub推送时将应用程序部署到EC2上
考虑到将应用程序部署到EC2时,我想可能有各种选择。以下是总结的选项。
总结在AWS上实现部署和自动扩展的方法。
最初,我们考虑了OpsWorks,但由于它不支持自动扩展,所以就舍弃了它。另外,如果使用Jenkins等工具可能是可行的,但是需要注意避免将Jenkins变成单点故障,并且为了与AWS进行协作而需要一些琐碎的配置,这让我感到有些麻烦。
所以,我尚未到达东京区域,但CodeDeploy支持自动伸缩,所以我尝试了一些测试,并进行了记录。
这次的例子中,我尝试使用CodeDeploy在GitHub上push代码时将WordPress部署到EC2上。
CodeDeploy是什么?
-
- アプリケーションのデプロイを行うためのサービス。デプロイするプログラミング言語などに制限はない
-
- アプリケーションにデプロイに特化した機能なので環境構築などに使うべきではない(やろうと思えばできるけどやらない方が良いと思う)環境構築もしたい場合、ElasticBeanstalkやOpsWorksを考えたほうが良い
appspec.ymlというファイルにデプロイ時の詳細を記述。デプロイ時の独自のライフサイクルタイミングで任意のシェルスクリプトを実行できる
特定のタグが付与されたEC2群もしくはオートスケーリングに紐づくEC2群にデプロイ可能
特定のリビジョンに戻ることが可能
現在はGitHubとS3と連携が可能(なぜCodeCommitがない??)
実行するためにはCodeDeployAgentを対象EC2(にインストールする必要がある
対象OSはAmazon Linux、Red Hat Enterprise Linux、Ubuntu Server、Microsoft Windows Server
CodeDeployエンドポイントと接続する必要があるため、プライベートサブネットの場合などにはNATが必要
假设
-
- AWS CLIインストール済み
-
- GitHubのアカウント取得済み
- 2015/7/20現在CodeDeployはtokyoリージョンはないのでus-east1で確認
请参考
-
- Using the AWS CodeDeploy Create Deployment Walkthrough
- Automatically Deploy from GitHub Using AWS CodeDeploy
创建CodeDeploy使用的角色
为AWS CodeDeploy创建一个服务角色
我们对CodeDeploy自身使用的角色进行设置。
首先,创建以下文件。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"codedeploy.us-east-1.amazonaws.com",
"codedeploy.us-west-2.amazonaws.com",
"codedeploy.eu-west-1.amazonaws.com",
"codedeploy.ap-southeast-2.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
完成后,执行以下命令以创建名为 CodeDeployDemo 的用于 CodeDeploy 的角色。
$aws iam create-role --role-name CodeDeployDemo --assume-role-policy-document file://CodeDeployDemo-Trust.json
在执行上述命令之后,
“Arn”: “arn:aws:iam::hogefuga:role/CodeDeployDemo”
阿恩: “arn:aws:iam::hogefuga:role/CodeDeployDemo”
以这种形式显示该角色的Arn,记下来。
此外,执行以下命令,以便将先前的角色配置为可用于CodeDeploy。
$aws iam attach-role-policy --role-name CodeDeployDemo --policy-arn arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole
创建RDS
请使用RDS在us-east1区域创建MySQL数据库,用于WordPress的使用。同时,请设置一个SecurityGroup,允许从接下来创建的EC2实例通过3306端口进行连接。请记下在创建时设置的用户名、密码以及创建后的RDS连接终端节点。
启动EC2
第一步: 启动一个亚马逊 Linux 或红帽企业 Linux 的亚马逊 EC2 实例。
-
- OSはAmazonLinux
-
- Auto-assign PublicIPを有効にする
-
- SecurityGroupのInboundでSSHとHTTPを0.0.0.0/0で許可し、Outboundは制限しない
-
- S3のread権限があるIAMロールを付与すること(CodeDeployAgentのインストールのため)
-
- NameタグではCodeDeployDemoと設定すること
- UserDataに以下の設定を行う。なお、CodeDeployAgent取得先バケット名はregionによって変わるので注意。また、SQL実行の箇所はユーザー名はroot、パスワードはpassword、RDSのエンドポイントはcodedeploy.cukvcqdui8ox.us-east-1.rds.amazonaws.com という場合の設定となるので適宜変更してください。
#!/bin/bash
# install CodeDeploy agent
yum -y update
yum install -y ruby
yum install -y aws-cli
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-us-east-1/latest/install . --region us-east-1
chmod +x ./install
./install auto
# install httpd
yum install -y httpd
chkconfig httpd on
service httpd start
# install application dependencies
yum install php php-mysql php-gd php-mbstring -y
yum install mysql -y
#exec sql
mysql -u root -ppassword -h codedeploy.cukvcqdui8ox.us-east-1.rds.amazonaws.com <<EOF
CREATE USER'wordpress-user'@'%' IDENTIFIED BY 'wordpress';
CREATE DATABASE \`wordpress\`;
GRANT ALL PRIVILEGES ON \`wordpress\`.*TO"wordpress-user"@"%";
FLUSH PRIVILEGES;
EOF
启动后,当StatusCheck变为running时,进行SSH连接并确认代理程序是否已安装。
$sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 6975
请根据需要,查看/var/log/cloud-init-output.log中的日志和其他中间件的配置。
将用于CodeDeploy的WordPress推送到GitHub
步骤2:配置您的源内容以部署到Amazon Linux或Red Hat Enterprise Linux Amazon EC2实例。
以下内容将在本地个人电脑上进行。
我会克隆WordPress的源代码到本地。
$mkdir -p /tmp/WordPress
$git clone https://github.com/WordPress/WordPress.git /tmp/WordPress
创建用于脚本配置的文件夹。
$mkdir -p /tmp/WordPress/scripts
我会创建一个停止httpd的脚本。
#!/bin/bash
isExistApp=`pgrep httpd`
if [[ -n \$isExistApp ]]; then
service httpd stop
fi
我还会编写启动httpd的脚本。
#!/bin/bash
service httpd start
我要创建一个脚本来更改权限。
#!/bin/bash
chown -R apache:apache /var/www/html/WordPress
chmod -R 744 /var/www/html/WordPress
修改创建的脚本集的权限。
$chmod +x /tmp/WordPress/scripts/*
在appsec.yml文件中,我们需要记录下源代码应该放置在哪里,以及在何种生命周期定时中应该做什么。
version: 0.0
os: linux
files:
- source: /
destination: /var/www/html/WordPress
hooks:
AfterInstall:
- location: scripts/change_permissions.sh
timeout: 300
runas: root
ApplicationStart:
- location: scripts/start_server.sh
timeout: 300
runas: root
ApplicationStop:
- location: scripts/stop_server.sh
timeout: 300
runas: root
请参考以下有关 appsec.yml 的详细信息。
AWS CodeDeploy AppSpec文件参考
接下来在Github上创建仓库。
在这个示例中,我们在浏览器中预先创建了一个名为 toshihirock/CodeDeployWordPress 的仓库。
在创建仓库后,将代码推送到GitHub。
$cd /tmp/WordPress
$git add .
$git commit -m "add codedeploy scripts"
$git remote rm origin
$git remote add origin https://github.com/toshihirock/CodeDeployWordPress.git
CodeDeploy设置
首先我们要用 CodeDeploy 创建一个应用。使用以下命令创建一个名为 WordPress_App 的应用。
$aws deploy create-application --application-name WordPress_App --region us-east-1
接下来,我们将创建一个部署组。在此配置中,我们设置了要将部署到哪些EC2实例上。在下面的示例中,我们创建了一个名为WordPress_DepGroup的部署面和组,它指示要将部署到拥有EC2标签Key=Name、Value=CodeDeployDemo的EC2实例群。
$aws deploy create-deployment-group \
--region us-east-1 \
--application-name WordPress_App \
--deployment-group-name WordPress_DepGroup \
--deployment-config-name CodeDeployDefault.OneAtATime \
--ec2-tag-filters Key=Name,Value=CodeDeployDemo,Type=KEY_AND_VALUE \
--service-role-arn arn:aws:iam::hogefuga:role/CodeDeployDemo
最终部署源代码。请根据需要将github-location选项更改为您自己的存储库名称和目标提交ID。
$aws deploy create-deployment \
--region us-east-1 \
--application-name WordPress_App \
--deployment-config-name CodeDeployDefault.OneAtATime \
--deployment-group-name WordPress_DepGroup \
--github-location commitId=74e74ad4e0f80fb91a6034f3be58fce5b45d4a2c,repository=toshihirock/CodeDeployWordPress
如果部署成功,我认为可以使用部署目标EC2的公共IP地址通过以下URL进行访问。
与GitHub进行协作
使用AWS CodeDeploy自动从GitHub部署
首先,在IAM中创建一个名为GitHub的用户。请记下在创建用户过程中显示出来的Access Key ID和Secret Access key。
另外,我們將以下政策作為CustomPolicy附加給上述用戶。PolicyName為CodeDeploy-Access。請注意,請將123ACCOUNTID部分更改為您自己的AWS帳號ID。
-
- IAM->Users->GitHub->InlinePolicies->click here
- Custom Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "codedeploy:GetDeploymentConfig",
"Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:deploymentconfig:*"
},
{
"Effect": "Allow",
"Action": "codedeploy:RegisterApplicationRevision",
"Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:application:WordPress_App"
},
{
"Effect": "Allow",
"Action": "codedeploy:GetApplicationRevision",
"Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:application:WordPress_App"
},
{
"Effect": "Allow",
"Action": "codedeploy:CreateDeployment",
"Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:deploymentgroup:WordPress_App/WordPress_DepGroup"
}
]
}
接下来进行GitHub的配置。添加AWS CodeDeploy服务。
-
- GitHubのページでリポジトリを選択(私の場合、toshihirock/CodeDeployWordPress)
-
- Settings
-
- Webhooks and Services
- Add Services->AWS CodeDeploy
以以下方式添加项目。
接下来,我们将获取GitHub的访问令牌。
显示个人访问令牌并选择生成个人访问令牌,然后按照以下方式进行设置。
設置完成後,請記下顯示的令牌資訊。
请重新转到先前设置CodeDeploy服务的页面,并添加GitHub自动部署。
-
- GitHubのページでリポジトリを選択(私の場合、toshihirock/CodeDeployWordPress)
-
- Settings
-
- Webhooks and Services
- Add Services->GitHub Auto-Deployment
我认为,在制作完成后,以下两项服务已经被设置好了。
因为准备工作已经完成,所以我将尝试向WordPress仓库提交代码。
$cd /tmp/WordPress
$git commit --allow-empty -m "test CodeDeploy"
$git push origin master
$git log -1
commit b74c07c54a747fd9a44be09031bcd272ae749bed
在执行上述操作后,您可以检查CodeDeploy界面以确认先前提交ID的修订版源代码是否已部署。
最后
我最近尝试了CodeDeploy,发现在GitHub挂钩的时候可以进行部署非常方便。而且不需要太过关注CodeDeploy本身的管理,这真是太轻松了。
我很希望能够快速与CodeCommit进行集成,并在VPC端点上实现CodeDeploy和CodeCommit,使其可以从私有子网中进行使用。