ブログ

ryuzeeによるブログ記事。不定期更新

AWS CodeDeployで簡単デプロイ(CLI編)

全国100万人のデプロイ・プロビジョニング自動化マニアのみなさんこんにちは!

AWSから新たにDeploy用のサービスAWS CodeDeployがリリースされたので早速試してみました。 これを使うと複数のサーバに同時にアプリケーションをリリースするのが簡単にできます。もうCapistranoとかでごちゃごちゃやる必要はない感じです!! 詳細を知りたい方は公式サイトのドキュメントを見てみるとよいです。

ただ、GUIでやるのも面白く無いので、awscliを使ってやっていきましょう!!

EC2インスタンスの準備

まず、us-west-2でEC2インスタンスを何台か起動しましょう。これがデプロイ先のサーバになります。

  • デプロイ先サーバの識別にはEC2インスタンスのタグを利用しますので、同時にデプロイする対象には、同じタグを設定します(EC2のタグのFilterと同じ挙動です)。ここでは起動したインスタンスのNameタグに、sampleapp1_aという名前を設定しました。
  • またデプロイ先のサーバからはAWSのAPIをコールするので、IAM Roleの設定が必要です。

またCodeDeploy用のデーモンをインストールする必要があるので、以下のようなスクリプトを実行します。EC2インスタンスの起動時にUser Dataを使って設定しても構いません。

#!/bin/bash
yum -y update
yum install -y aws-cli
cd /home/ec2-user
wget https://aws-codedeploy-us-west-2.s3.amazonaws.com/latest/install .
chmod +x ./install
./install auto

awscliの最新化

CodeDeployではアプリケーションという単位でデプロイが管理されます。 アプリケーションを作るためにawscliを利用しますので、まずは以下のようにしてawscliを最新化します。

sudo pip install --upgrade awscli

CodeDeployアプリケーションの作成

以下のように実行して、アプリケーションを作ります。

aws deploy create-application \
  --application-name sampleapp1 \
  --region us-west-2

以下のように表示されれば作成は成功です。マネジメントコンソールで、sampleapp1というアプリケーションが作られているのが確認できるはずです。

{
    "applicationId": "0c63b4fc-34ab-42c8-95d7-b9201f45b7b1"
}

Service Roleの作成

CodeDeployがAWSの各サービスとやりとりするためのService Roleを作成します。

role.json

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {
                "Service": [
                    "codedeploy.us-west-2.amazonaws.com",
                    "codedeploy.us-east-1.amazonaws.com"
                ]
            }
        }
    ]
}

作成したら以下を実行します。

aws iam create-role \
  --role-name sampleapp1-role \
  --assume-role-policy-document file://role.json

以下のように実行結果が表示されます。Arnを控えておいてください。

{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2008-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Principal": {
                        "Service": [
                            "codedeploy.us-west-2.amazonaws.com",
                            "codedeploy.us-east-1.amazonaws.com"
                        ]
                    },
                    "Effect": "Allow",
                    "Sid": ""
                }
            ]
        },
        "RoleId": "AROAIDHZOQ7HEHQNGX3OI",
        "CreateDate": "2014-11-13T06:21:51.216Z",
        "RoleName": "sampleapp1-role",
        "Path": "/",
        "Arn": "arn:aws:iam::660875509136:role/sampleapp1-role"
    }
}

次にRoleのポリシーを設定します。

policy.json

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": "*",
            "Action": [
                "ec2:Describe*"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": "*",
            "Action": [
                "autoscaling:CompleteLifecycleAction",
                "autoscaling:DeleteLifecycleHook",
                "autoscaling:DescribeLifecycleHooks",
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:PutLifecycleHook",
                "autoscaling:RecordLifecycleActionHeartbeat"
            ]
        }
    ]
}

のように作成し、以下を実行します。

aws iam put-role-policy \
  --role-name sampleapp1-role \
  --policy-name sampleapp1-policy \
  --policy-document file://policy.json

Deployment Groupの作成

Deployment Groupとは、デプロイ対象のサーバ群だと考えると分かりやすいと思います。 例えば5台のWebサーバから構成されるシステムで中身が同じであれば、これを1つのDeployment Groupとして定義することで、アプリケーションを5台にデプロイすることができます。なお、デプロイのタイミングで一気に同時でデプロイする、順番にデプロイする、半分づつデプロイする、とかを決められます。

aws deploy create-deployment-group \
  --application-name sampleapp1 \
  --region us-west-2 \
  --deployment-group-name deploygroup1 \
  --service-role-arn arn:aws:iam::660875509136:role/sampleapp1-role \
  --ec2-tag-filters Key=Name,Value=sampleapp1_a,Type=KEY_AND_VALUE

以下のように表示されれば作成は成功です。

{
    "deploymentGroupId": "c8115519-4784-461a-a5a2-4d407d3dd50d"
}

デプロイ対象のコードの準備

今回はとりあえずawscliでの作業を目的としているので適当な感じでいきます。 まず適当なディレクトリを作成して、そこに移動してください。 CodeDeployでもっとも大事なファイルはappspec.ymlというファイルです。このファイルにデプロイするファイルやデプロイ前後の処理を記述します。例えば以下のようになります。

version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root

この例では、/var/www/htmlに、index.htmlを配置すること、デプロイの前にscriptsディレクトリの中のスクリプトを実行し、アプリケーション停止時にも指定した処理を実行するようになっています。(ApplicationStop, BeforeInstall, AfterInstall, ApplicationStart, ValidateServiceが指定でき、順に実行されます) 詳しい説明はAWSのサイトを見るとよいと思います。

またデプロイ対象のindex.htmlやscripts系のファイルは上記の設定にしたがって配置しておきます。

リビジョンを用意する

次にS3にアップします。なお、S3のBucketは、同一リージョンにあることが必要そう(他のリージョンで試したらダメだった)なので、適宜新たに作成してください。(GitHubとの連携もできますが今回は割愛します)

aws deploy push \
  --application-name sampleapp1 \
  --s3-location s3://deploy-test-yoshiba/sampleapp1/app.zip \
  --source ./ \
  --region us-west-2

デプロイの実行

最後に実際のデプロイを実施します。以下のコマンドを実行します。しばらく待つと変更が反映されるはずです。

aws deploy create-deployment \
  --application-name sampleapp1 \
  --s3-location bucket=aws-pro-serve-yoshiba,key=sampleapp1/app.zip,bundleType=zip,eTag="76a2612bb5cf05a86d2da2cde95759e0" \
  --deployment-group-name deploygroup1 \
  --region us-west-2

これでデプロイが実行されて、コードが本番に反映されます。 以降変更を反映する場合は最後の2つの手順だけをおこなえばOKということになります。

らくちんですね!!

アジャイルコーチングやトレーニングを提供しています

株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。

詳細はこちら
  • スクラム実践者が知るべき97のこと
  • 著者/訳者:Gunther Verheyen / 吉羽龍太郎 原田騎郎 永瀬美穂
  • 出版社:オライリージャパン(2021-03-23)
  • 定価:¥ 2,640
  • スクラムはアジャイル開発のフレームワークですが、その実装は組織やチームのレベルに応じてさまざまです。本書はスクラムの実践において、さまざまな課題に対処してきた実践者が自らの経験や考え方を語るエッセイ集です。日本語書き下ろしコラムを追加で10本収録
  • プロダクトマネジメント ―ビルドトラップを避け顧客に価値を届ける
  • 著者/訳者:Melissa Perri / 吉羽龍太郎
  • 出版社:オライリージャパン(2020-10-26)
  • 定価:¥ 2,640
  • プロダクト開発を作った機能の数やベロシティなどのアウトプットで計測すると、ビルドトラップと呼ばれる失敗に繋がります。本書ではいかにしてビルドトラップを避けて顧客に価値を届けるかを解説しています。
  • SCRUM BOOT CAMP THE BOOK 【増補改訂版】
  • 著者/訳者:西村直人 永瀬美穂 吉羽龍太郎
  • 出版社:翔泳社(2020-05-20)
  • 定価:¥ 2,640
  • スクラム初心者に向けて基本的な考え方の解説から始まり、プロジェクトでの実際の進め方やよく起こる問題への対応法まで幅広く解説。マンガと文章のセットでスクラムを短期間で理解できます。スクラムの概要を正しく理解したい人、もう一度おさらいしたい人にオススメ。
  • みんなでアジャイル ―変化に対応できる顧客中心組織のつくりかた
  • 著者/訳者:Matt LeMay / 吉羽龍太郎、永瀬美穂、原田騎郎、有野雅士
  • 出版社:オライリージャパン(2020-3-19)
  • 定価:¥ 2,640
  • アジャイルで本当の意味での成果を出すには、開発チームだけでアジャイルに取り組むのではなく、組織全体がアジャイルになる必要があります。本書にはどうやってそれを実現するかのヒントが満載です
  • レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス
  • 著者/訳者:David Scott Bernstein / 吉羽龍太郎、永瀬美穂、原田騎郎、有野雅士
  • 出版社:オライリージャパン( 2019-9-18 )
  • 定価:¥ 3,132
  • レガシーコードになってから慌てるのではなく、日々レガシーコードを作らないようにするにはどうするか。その観点で、主にエクストリームプログラミングに由来する9つのプラクティスとその背後にある原則をわかりやすく説明しています。
  • Effective DevOps ―4本柱による持続可能な組織文化の育て方
  • 著者/訳者:Jennifer Davis、Ryn Daniels / 吉羽 龍太郎、長尾高弘
  • 出版社:オライリージャパン( 2018-3-24 )
  • 定価:¥ 3,888
  • 主にDevOpsの文化的な事柄に着目し、異なるゴールを持つチームが親和性を高め、矛盾する目標のバランスを取りながら最大限の力を発揮する方法を解説します
  • ジョイ・インク 役職も部署もない全員主役のマネジメント
  • 著者/訳者:リチャード・シェリダン / 原田騎郎, 安井力, 吉羽龍太郎, 永瀬美穂, 川口恭伸
  • 出版社:翔泳社( 2016-12-20 )
  • 定価:¥ 1,944
  • 米国で何度も働きやすい職場として表彰を受けているメンローの創業者かつCEOであるリチャード・シェリダン氏が、職場に喜びをもたらす知恵や経営手法、より良い製品の作り方などを惜しみなく紹介しています
  • アジャイルコーチの道具箱 – 見える化の実例集
  • 著者/訳者:Jimmy Janlén / 原田騎郎, 吉羽龍太郎, 川口恭伸, 高江洲睦, 佐藤竜也
  • 出版社:Leanpub( 2016-04-12 )
  • 定価:$14.99
  • この本は、チームの協調とコミュニケーションを改善したり、行動を変えるための見える化の実例を集めたものです。96個(+2)の見える化の方法をそれぞれ1ページでイラストとともに解説しています。アジャイル開発かどうかに関係なくすぐに使えるカタログ集です
  • カンバン仕事術 ―チームではじめる見える化と改善
  • 著者/訳者:原田騎郎 安井力 吉羽龍太郎 角征典 高木正弘
  • 出版社:オライリージャパン( 2016-03-25 )
  • 定価:¥ 2,138
  • チームの仕事や課題を見える化する手法「カンバン」について、その導入から実践までを図とともにわかりやすく解説した書籍。カンバンの原則などの入門的な事柄から、サービスクラス、プロセスの改善など、一歩進んだ応用的な話題までを網羅的に解説します。
  • Software in 30 Days スクラムによるアジャイルな組織変革“成功"ガイド
  • 著者/訳者:Ken Schwaber、Jeff Sutherland著、角征典、吉羽龍太郎、原田騎郎、川口恭伸訳
  • 出版社:アスキー・メディアワークス( 2013-03-08 )
  • 定価:¥ 1,680
  • スクラムの父であるジェフ・サザーランドとケン・シュエイバーによる著者の日本語版。ビジネス層、マネジメント層向けにソフトウェア開発プロセス変革の必要性やアジャイル型開発プロセスの優位性について説明
  • How to Change the World 〜チェンジ・マネジメント3.0〜
  • 著者/訳者:Jurgen Appelo, 前川哲次(翻訳), 川口恭伸(翻訳), 吉羽龍太郎(翻訳)
  • 出版社:達人出版会
  • 定価:500円
  • どうすれば自分たちの組織を変えられるだろう?それには、組織に変革を起こすチェンジ・マネジメントを学習することだ。アジャイルな組織でのマネージャーの役割を説いた『Management 3.0』の著者がコンパクトにまとめた変化のためのガイドブック