使用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

以以下方式添加项目。

Screen Shot 2015-07-20 at 6.56.36 AM.png

接下来,我们将获取GitHub的访问令牌。

显示个人访问令牌并选择生成个人访问令牌,然后按照以下方式进行设置。

Screen Shot 2015-07-20 at 7.03.50 AM.png

設置完成後,請記下顯示的令牌資訊。

请重新转到先前设置CodeDeploy服务的页面,并添加GitHub自动部署。

    • GitHubのページでリポジトリを選択(私の場合、toshihirock/CodeDeployWordPress)

 

    • Settings

 

    • Webhooks and Services

 

    Add Services->GitHub Auto-Deployment
Screen Shot 2015-07-20 at 7.57.00 AM.png

我认为,在制作完成后,以下两项服务已经被设置好了。

Screen Shot 2015-07-20 at 9.23.48 AM.png

因为准备工作已经完成,所以我将尝试向WordPress仓库提交代码。

$cd /tmp/WordPress
$git commit --allow-empty -m "test CodeDeploy"
$git push origin master
$git log -1
commit b74c07c54a747fd9a44be09031bcd272ae749bed

在执行上述操作后,您可以检查CodeDeploy界面以确认先前提交ID的修订版源代码是否已部署。

Screen Shot 2015-07-20 at 8.03.23 AM.png

最后

我最近尝试了CodeDeploy,发现在GitHub挂钩的时候可以进行部署非常方便。而且不需要太过关注CodeDeploy本身的管理,这真是太轻松了。

我很希望能够快速与CodeCommit进行集成,并在VPC端点上实现CodeDeploy和CodeCommit,使其可以从私有子网中进行使用。

广告
将在 10 秒后关闭
bannerAds