Help us understand the problem. What is going on with this article?

AWS CodeDeployを使ってPHPアプリケーションをデプロイしてみた

More than 1 year has passed since last update.

AWS CodeDeployを使って、お手製デプロイシェルやJenkinsおじさんから卒業しよう!というお話です。
今回はPHPアプリケーションをS3経由でデプロイしてみようと思います。

AWS CodeDeploy is 何

Q: AWS CodeDeploy とは何ですか?
AWS CodeDeploy は、Amazon EC2 インスタンス、およびオンプレミスで稼働するインスタンスを含む、さまざまなインスタンスへのコードのデプロイを自動化するサービスです。AWS CodeDeploy を使用すると、お客様はアプリケーションの複雑なアップデート処理、デプロイ中のダウンタイムの回避、新規機能の迅速なリリースが容易になります。AWS CodeDeploy を使用すると、エラーを起こしやすい手動操作やインフラストラクチャのサービススケールの必要性を排除しながら、デプロイの自動化を行うことが可能となり、1 つのインスタンスへのデプロイや、数千のインスタンスへのデプロイも容易に行うことができます。

AWS CodeDeployのよくある質問より引用

メリット/デメリット

メリット

  • フルマネージド
    • AWSのフルマネージドサービスなのでdeployサーバ(Jenkins等)をたてる必要がない。
  • 安い
    • EC2インスタンスへのデプロイは無料(オンプレへのデプロイ時にのみ微量な料金が発生。詳細はコチラ
    • deployサーバ(Jenkins等)のインスタンス代もかからない。
  • 多様なデプロイ方法
    • 複数のデプロイ対象に対して、一台ずつ、一気に全台、半分だけ、などのデプロイ速度調節が可能
    • blue/greenデプロイもサポート
  • 簡単
    • デプロイ先EC2は任意のタグで自動的に判別される
    • ローカルのデプロイ対象ディレクトリを指定してaws-cliを実行するだけで、zipで固めてS3へpushしてくれる
    • デプロイ後の処理(パーミッション変更, Apacheのgraceful 等)はymlに書いてデプロイ対象ディレクトリに置いとくだけ

などなど。

デメリット

  • 新しいやりかたを覚える手間くらい?

Deployの大まかな流れ

3b41bde3-3e09-ed85-157d-313c3727031d.png

Step1: Build

builderサーバでbuildを実行した後、aws-cli経由でソースコードzipで固め、s3にpushします。

Step2: Deploy

AWSコンソールからAWS CodeDeployを実行すると、S3にあるdeploy対象のソースコードがdeploy対象のサーバ群にdeployされ、結果が通知されます。

今回は教材としてconcrete5というCMSをデプロイしてみようと思います。
※本当はconcrete5でここまでする必要はありません。

環境準備

AWS CodeDeploy

IAM Role作成

AWS CodeDeployで利用する為のIAM Roleを作成します。

アクセス許可する管理ポリシーに AWSCodeDeployRole をアタッチします。
さらに、信頼されたエンティティに codedeploy.ap-northeast-1.amazonaws.com を追加(東京リージョンで利用する場合)します。

信頼関係
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "codedeploy.ap-northeast-1.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
AWS CodeDeploy アプリケーション作成

AWSコンソールより、AWS CodeDeploy アプリケーションを作成します。
下記の情報を入力し、新規アプリケーションを作成します。

設定項目 設定値
アプリケーション名 任意の名前
デプロイグループ名 任意の名前
デプロイタイプ 今回は インプレースデプロイ を選択
インスタンスの追加 デプロイ先インスタンスを絞り込むためのタグを指定する
例:Role=webserver, Env=development
デプロイ設定 今回は CodeDeployDefult.OneAtAtime を選択
詳細設定 今回はデフォルトのまま
サービスロール IAM Role作成 で作ったAWS CodeDeployで利用する為のロールを選択

builder(EC2)

IAM Role作成

以下のIAMRoleを作成し、EC2インスタンス作成時に割り当ておきます。

アクセス許可する管理ポリシーに AWSCodeDeployDeployerAccess をアタッチします。

aws-cli更新

aws-cliを最新版にアップデートしてきます。

concrete5用ミドルウェア設定

concrete5で利用するミドルウェアをセットアップしておきます > concrete5の使用条件
詳細は割愛しますが、GitHubに Ansible playbook を置いておくので使いたい方はどうぞ > github

deploy先(EC2)

IAM Role作成

空のIAMRoleを作成し、EC2インスタンス作成時に割り当ておきます。

aws-cli更新

aws-cliを最新版にアップデートしておきます。

concrete5用ミドルウェア設定

concrete5で利用するミドルウェアをセットアップしておきます > concrete5の使用条件
詳細は割愛しますが、GitHubに Ansible playbook を置いておくので使いたい方はどうぞ > github

AWS CodeDeploy Agentインストール

AWS CodeDeploy Agentをインストールします

### インストール
$ sudo yum install -y wget
$ sudo su - ec2-user
$ wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto

### 確認
$ yum info codedeploy-agent
Loaded plugins: priorities, update-motd, upgrade-helper
Installed Packages
Name        : codedeploy-agent
Arch        : noarch
Version     : 1.0
Release     : 1.1067
Size        : 11 M
Repo        : installed
From repo   : /codedeploy-agent-1.0-1.1067.noarch.tmp-20170130-3372-owpn7q
Summary     : Provides the required files for CodeDeploy agent to run in EC2 instances
License     : Amazon.com Internal
Description : CodeDeploy instance agent is responsible for doing the actual work of deploying software
            : on an EC2 instance.

$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 2394

S3

ソースコードpush先のS3バケットを作成しておきます。
各IAMロールにアクセス権を付与するバケットポリシーを作成します。

バケットポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "AWS CodeDeploy用ロールARN",
                    "builder用IAMロールARN",
                    "deploy先用IAMロールARN"
                ]
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::deploy用S3バケット名"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "AWS CodeDeploy用ロールARN",
                    "builder用IAMロールARN",
                    "deploy先用IAMロールARN"
                ]
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::deploy用S3バケット名/*"
        }
    ]
}

Deploy処理

Step1:Deploy準備(build)

Step1-1:build処理

builder上にソースコードをcheckoutし、composer実行

$ git clone -b master https://github.com/concrete5/concrete5.git
$ cd concrete5
$ composer install
Step1-2:AppSpecの作成

AppSpec is 何?

Q: AppSpec ファイルとは何ですか?
AppSpec ファイルとは、コピーするファイルおよび実行するスクリプトを指定する設定ファイルです。AppSpec ファイルは YAML フォーマットを使用しており、リビジョンのルートディレクトリに含める必要があります。

AWS CodeDeployのよくある質問より引用

要するに、Deploy処理実行時にサーバ側で処理する内容を定義するYAMLです。
そんなわけで、ソースコードのルートディレクトリ直下に、AppSpecとhooksスクリプトを追加します。

今回のAppSpecでは、

  • ソースのインストール先を指定
  • ソースコード配下のパーミッションを再帰的にapache:apacheに変更
  • ソースインストール後にhooksスクリプト経由でApacheのgracefulを実行

のような処理を定義します。

AppSpecのマニュアルはこちら > AWS CodeDeploy AppSpec File Reference

appspec.yml
version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/example.com/htdocs/
permissions:
  - object: /var/www/example.com/htdocs/
    pattern: "**"
    owner: apache
    group: apache
hooks:
  AfterInstall:
    - location: hooks/apache_graceful.sh
      timeout: 15
      runas: root
hooks/apache_graceful.sh
#!/bin/sh
service httpd graceful

hooksスクリプトにはあらかじめ実行権限を与えておくこと。
chmod +x hooks/*

以後、デプロイ処理内容に変更がなければこのStepは初回のみでOKです。

Step1-3:build結果をS3にpush

aws deploy push コマンドでbuild結果をzipで固めてS3にpushします。

後で以前のバージョンにデプロイし直す事を考慮すると、zipファイル名は他と被らない様にするのが望ましい( タイムスタンプcommit id を付与する 等)です。

pushの例(東京リージョン)
$ aws deploy push \
--region ap-northeast-1 \
--application-name CodeDeployアプリケーション名 \
--s3-location s3://S3バケット名/zipファイル名.zip \
--source ソースディレクトリ

pushに成功すると eTag が付与されます。

Step2:Deploy処理

Step2-1:Deploy実行

AWSコンソールの AWS CodeDeploy 画面より、準備段階で作成したアプリケーション、デプロイグループを選択し、 新しいリビジョンのデプロイ を選択します。
d0faa7d3-ec2c-5189-c65b-2797a9aa9fc2-1.png

デプロイの作成画面で下記の内容を入力し、

設定項目 設定値
アプリケーション デプロイ対象のアプリケーション
デプロイグループ デプロイ対象のデプロイグループ
リビジョンタイプ アプリケーションは Amazon S3 に格納されています を選択
リビジョンの場所 Step1-3でpushした内容が選択肢にあればそれを選択
なければ s3://バケット名/folder/zipファイル名 を入力
デプロイメントの説明 任意入力
デプロイ設定 用途に合わせて選択

デプロイボタンをポチります!

057b554f-6c7a-2924-5cbe-3d09f02299fe.png

プログレスバーが緑色だったらデプロイ成功です!

もしデプロイに失敗したら、deploy先インスタンスにある /var/log/aws/codedeploy-agent/codedeploy-agent.log の内容を確認しましょう。

Step2-2:確認

ブラウザからアクセスしてみると、、、
a62d37bc-7e2c-14db-0f66-5bb41ec1b08c.png

無事、concrete5のインストール画面が表示されました!

まとめ

AWS CodeDeployは初期設定が少々複雑ですが、それを乗り越えれば大きなメリットが待っています!!

あと、PHP限定っぽいタイトルを付けていますが他の言語でもおおまかな流れは一緒なので応用が効くはずです。

今度はblue/greenデプロイを試してみようと思います。

参考サイト

AWS再入門 AWS CodeDeploy 編
AWS CodeDeploy AppSpec File Reference
CodeDeployでディレクトリのパーミッションを設定する
AWS CodeDeploy の AppSpec を読み解く

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away