話題の記事

「AWSとGitHubで始めるDevOpsハンズオン」の資料を公開します!

2017.06.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、中山です。

弊社はGitHubと国内初のサービスパートナー契約を結びました。そこで、ソースコード共有サービスとしてデファクトスタンダードとなっているGitHubと、クラウド業界で高いシェアを誇っているAWSを組み合わせて、継続的インテグレーション/継続的デリバリーを構築するハンズオンを実施します。すでに募集ページも公開しているので是非お越しください。まずは大阪から、次に東京で開催します。

【6/9】入門セミナーシリーズ第二回 AWSとGitHubで始めるDevOpsハンズオン in 大阪

【会場変更/満員御礼】入門セミナーシリーズ第二回 AWSとGitHubで始めるDevOpsハンズオン in 東京

本エントリではハンズオンで利用する資料を事前に公開します。どういった内容を実施するのかぜひご覧になってください。

ハンズオンでは弊社エンジニアが各種サービスの説明をしながらステップバイステップで進めていきますので、「まだ触ったことがないけどついていけるかな」といった不安感があっても大丈夫です。ぜひ参加してGitHub/AWSの知識を持ち帰っていただければと思います。

「もうすでに触ったことあるよ」といった方には、弊社の豊富なAWS構築事例で得られた知見をご紹介したいと思いますので、より深い知識を得られるともいます。突っ込んだご質問も募集中です!

手順

ハンズオンは以下の手順で進めていきます。本エントリでは簡略的な説明になっていますが、会場では一つ一つ説明しながら進めていきます。

最終的に以下のような構成を作成します。

devops-hands-on-24

1. リポジトリのフォーク

今回のハンズオンで利用するサンプルアプリケーションを自分のGitHubアカウントに事前にフォークしておきましょう。アプリケーションはExpressで作成した簡単なWebアプリケーションです。

まず、以下のリンクを開いてください。

devops-hands-on-14

後ほどソースコードを修正するので、ローカルにクローンしておきましょう。以下のコマンドをターミナルソフトウェア上で実行してください。 <_YOUR_GITHUB_NAME_> は自分のGitHubアカウント名に置き換えてください。

$ git clone https://github.com/<_YOUR_GITHUB_NAME_>/aws-github-devops-hands-on-sample-app.git

ls コマンドなどで正常にクローンが実行されたことを確認してください。

$ cd aws-github-devops-hands-on-sample-app
$ ls
app.js       bin          package.json public       routes       views

2. キーペアの作成

インスタンスにSSHでログインするためにキーペアを事前に作成しておきます。今回のハンズオンではインスタンスにSSHでログインしない想定ですが、デバッグ用途などで用意しておくと便利です。すでに作成している場合この作業は必要ありません。

  • マネジメントコンソールのトップ画面より「EC2」をクリック

devops-hands-on-1

  • 「EC2ダッシュボード」から「キーペア」をクリック

devops-hands-on-2

  • 「キーペアの作成」をクリックしてキーペア名をわかりやすい名前(hands-onなど)で入力

devops-hands-on-3

  • 「作成」をクリックするとキーペアのダウンロード画面が表示されるので、任意の場所に保存

devops-hands-on-4

 

3. CloudFormationスタックの作成

本ハンズオンではオートスケーリンググループ内のインスタンスに対してアプリケーションをデプロイしていきます。一からマネジメントコンソールで作成すると大変なので、CloudFormationのテンプレートでサクっと作成しましょう。このテンプレートでは以下のスタックを作成します。

devops-hands-on-5-1

以下のリンクをクリックするとスタックの作成画面が表示されます。スタック名をわかりやすい名前(hands-on-stackなど)にし、事前に作成したキーペアをパラメータのプルダウンメニューから選択してください。

launch-stack

スタックの作成後、CloudFromationの「出力」で表示されるロードバランサ(ELB)のFQDNにアクセスして以下のような画面が表示されることを確認してください。

devops-hands-on-6-1

4. IAM Roleの作成

CodeDeployのセットアップをする際に必要になるので、事前にIAM Roleを作成しておきましょう。

  • マネジメントコンソールのトップ画面から「IAM」をクリック

devops-hands-on-7

  • IAMダッシュボードより「ロール」をクリック

devops-hands-on-8

  • 「新しいロールの作成」をクリック

devops-hands-on-9

  • 「AWS サービスロール」から「AWS CodeDeploy」を選択してクリック

devops-hands-on-10

  • 「ポリシー名」に「AWSCodeDeployRole」という名前のポリシーが表示されるので、チェックボックスにチェックを入れて「次のステップ」をクリック

devops-hands-on-11

  • 最後に確認画面が表示されるので、「ロール名」にわかりやすい名前(hands-on-codedeploy-roleなど)を入力して、「ロールの作成」をクリック

devops-hands-on-12-1

すると、「ロール」の画面から先程作成したロールが表示されます。

devops-hands-on-13

5. パイプラインの作成

ハンズオンで利用する主要なサービスのCodePipeline/CodeBuild/CodeDeployを利用したパイプラインを作成していきます。もちろん、1つずつ作成することも可能ですが、CodePipelineの画面からいっぺんに作成すると簡単です。

  • マネジメントコンソールのトップ画面より「CodePipeline」をクリック

devops-hands-on-15

  • まだパイプラインを作成していない場合は以下のような画面が表示されるので「今すぐ始める」をクリック

devops-hands-on-16

  • パイプラインのセットアップが開始するのでパイプライン名をわかりやすい名前(hands-on-pipelineなど)で入力して「次のステップ」をクリック

devops-hands-on-17

  • ソースプロバイダのセットアップが始まるので以下の表のように入力後、「次のステップ」をクリック
入力項目
ソースプロバイダ GitHub
リポジトリ フォークしておいたリポジトリ
ブランチ master
  • ビルドプロバイダのセットアップが始まるので以下の表のように入力後、「ビルドプロジェクトの保存」をクリックしてから「次のステップ」をクリック
入力項目
ビルドプロバイダ AWS CodeBuild
プロジェクトの設定 新しいビルドプロジェクトを作成
プロジェクト名 わかりやすい名前(hands-on-projectなど)
環境イメージ AWS CodeBuild マネージド型イメージの使用
OS Ubuntu
ランタイム Node.js
バージョン aws/codebuild/nodejs:6.3.1
ビルド仕様 ソースコードのルートディレクトリの buildspec.yml を使用
CodeBuild サービスロール アカウントで新しいロールを作成します
VPC No VPC
  • デプロイプロバイダのセットアップが始まるのでプロバイダに「AWS CodeDeploy」を入力後、「AWS CodeDeploy に新たにアプリケーションを作成します。」のリンクをクリック

devops-hands-on-19

  • すると、CodeDeployの作成画面が表示されるので以下の表のように入力後、「アプリケーションの作成」をクリック
入力項目
アプリケーション名 わかりやすい名前(hands-on-appなど)
デプロイグループ名 わかりやすい名前(hands-on-groupなど)
デプロイタイプ Blue/Greenデプロイ
環境設定 Auto Scaling グループの自動コピー
Auto Scaling グループ CloudFormationで作成したオートスケーリンググループ
ロードバランサ CloudFormationで作成したロードバランサ
元のインスタンス デプロイの成功後にデプロイグループの置き換え元インスタンスを終了 0 日 0 時間 0 分
サービスロール 事前に作成したCodeDeploy用ロール
  • デプロイプロバイダのセットアップ画面で作成したCodeDeployの設定が反映されるので、以下のように入力後「次のステップ」をクリック

devops-hands-on-20

  • CodePipelineにアタッチするIAM Roleの画面に変わるので、「ロールの作成」をクリック後、遷移する画面で「許可」をクリック

devops-hands-on-21

  • IAM Roleの作成が完了したら「次のステップ」をクリック

devops-hands-on-22

  • 最後に確認画面が表示されるので、内容を確認後、「パイプラインの作成」をクリック

すると、パイプラインが自動で開始されます。が、この時点では必要な設定が完了していないため以下のように失敗してしまいます。次のステップで作成していきましょう。

devops-hands-on-23

6. buildspec.ymlの作成

CodeBuildの設定ファイルである buildspec.yml を用意します。エディタを開いて以下の内容でリポジトリのトップディレクトリに保存してください。

  • buildspec.yml
version: 0.2

phases:
  install:
    commands:
      - |
        npm install

  pre_build:
    commands:
      - |
        npm test

  build:
    commands:
      - |
        echo 'no build'

artifacts:
  files:
    - "**/*"

7. appspec.ymlの作成

続いてCodeDeployの設定ファイルである appspec.yml と各種Hookスクリプトを用意します。先程と同じように以下の内容でファイルを保存してください。

  • appspec.yml
version: 0.0
os: linux

files:
  - source: /
    destination: /usr/src/app

hooks:
  BeforeInstall:
    - location: hooks/before_install.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: hooks/application_start.sh
      timeout: 300
      runas: root
  ValidateService:
    - location: hooks/validate_service.sh
      timeout: 300
      runas: root
  • hooks/before_install.sh
#!/usr/bin/env bash

app_src_path="/usr/src/app"
app_log_path="/var/log/app"

mkdir "$app_src_path" "$app_log_path"
  • hooks/application_start.sh
#!/usr/bin/env bash

app_path="/usr/src/app/bin/www"
forever_log="/var/log/app/forever.log"
app_access_log="/var/log/app/access.log"
app_error_log="/var/log/app/error.log"

forever start \
  -l "$forever_log" \
  -o "$app_access_log" \
  -e "$app_error_log" \
  "$app_path"
  • hooks/validate_service.sh
#!/usr/bin/env bash

curl http://localhost:3000/

8. リポジトリへのプッシュ

各設定ファイルの準備ができたらフォークしたリポジトリへプッシュしましょう。以下のコマンドを実行してください。

# ステージングへの追加
$ git add .
# コミット
$ git commit -m 'add buildspec.yml & appspec.yml'
# プッシュ
$ git push origin master

9. パイプラインの動作確認

GitHubリポジトリへのプッシュを契機にパイプラインが実行されます。最後にパイプラインが正常に動作するか確認しましょう。最終的に以下の画像のように全てのステージで「成功」と表示されたらOKです。

devops-hands-on-28

CodeBuild/CodeDeployの画面からより詳細な結果を確認できます。

  • CodeBuild

devops-hands-on-25

  • CodeDeploy

devops-hands-on-27

http://<ELBのFQDN>/express/ にアクセスするとExpressで作成したWebアプリケーションが表示されます。

devops-hands-on-26

10. 追加の問題

時間が余ったら以下の問題をやってみましょう。こちらは一度自分でどうやって設定するのか考えて実施してみてください。後ほど答え合わせをやります。

  • CodeDeployの設定を変更してみる
    • 旧インスタンスを削除するのではなく一定期間残したい場合は?
  • CodeBuildを深く理解する
    • 独自の環境変数を設定するには?
    • ※ ヒント: MY_KEYにMY_VARを設定する
  • デプロイ前に承認ステージを追加してみる
    • CodePipelineで承認処理を実行させるためには?
    • ※ ヒント: 事前にSNSトピックを作成しメールアドレスをサブスクライブしておく
  • ソースコードを修正してみる
    • master ブランチからトピックブランチを作成する
    • 先程設定したCodeBuildの環境変数をWebページに表示するには?
    • ※ ヒント: views/index.pug に以下を追記(pの前はスペース2つ)
    • echo " p MY_KEY is $MY_KEY" >> views/index.pug
    • master ブランチにプルリクエストを出してみる
    • プルリクエストを master ブランチにマージしてみる

補足. ハンズオン環境の掃除

ハンズオンで作成した環境を削除したい場合は以下の手順を参考にしてください。環境を削除する際には順番が重要です。CloudFormationで作成したものと手動で作成したものが相互に参照しているからです。以下の順番で削除していきます。

  • CodePipelineの削除
  • CodeBuildの削除
  • CodeDeployの削除
  • 以下3つのIAM Role削除
    • CodePipeline用
    • CodeBuild用
    • CodeDeploy用
  • CodePipelineのアーティファクト保存用S3バケット削除
    • ※ 他のパイプラインでも利用している場合があるので注意
  • CodeDeployが自動で作成したオートスケーリンググループの削除
  • CloudFormationスタックの削除
  • キーペアの削除(必要であれば)