AWS Code シリーズを使って git push と連動して静的コンテンツを自動リリースする環境の作り方

 この記事は、 OpsJAWS Advent Calendar 2017 - Qiita の1日目分として書かせていただきます。(既に12/9ですが、空いていたので埋めさせていただきました!)

 S3の静的ホスティング機能が便利でたまりません。フロントはS3、バックエンドは API GW + Lambda + DynamoDB で、安い・はやい・うまい三拍子揃ったWebサービスを提供していきたいです。

 ただし、この「安い」とか「はやい」ですが、一番ネックになるのは人手がかかる部分だと思っています。コア機能を開発するのに時間をかけるのはいいとして、それ以外の部分の無駄を極力減らしていくことが重要だと思います。AWSには運用を支援するサービスがたくさんありますので、少しずつ使い方をまとめていきたいと思います。まずは入門編ということで、下記の流れを自動化します。

  • S3上で静的コンテンツをWebホスティングし、
  • 静的コンテンツを CodeCommit で管理し、
  • 修正Pushされるたびに、自動的にS3上に静的コンテンツをデプロイしたい(★ここ!)

ただの静的コンテンツなので、プログラムのビルドは必要ありません。将来的には、Vue.js や Angular で作成したフロントコンテンツをビルドし、S3に配置するところまでまとめたいのですが、まずは簡単なものから始めていきます。

 リリースまでのフローイメージとしては、

エンジニア -(git push)-> Code Commit -> Code Build -> S3

のような形になります。CodePipeline はこの一連の流れを司る役割だと思ってください。では始めていきます。

静的コンテンツを配置するS3バケットの作成

 まず、静的コンテンツを配置するS3バケットを作成していきます。こちらの記事の途中で作成手順を記載しておりますので、参照してみてください。

www.ketancho.net

CodeCommit リポジトリ作成

 続いて、Git サービスである CodeCommit を使って、ソースリポジトリを作成していきます。こちらも過去にまとめているので、参照してください。今回はリポジトリだけを作成し、あとでローカルリポジトリを Push する形を取りますので、 git clone はしていただかなくて問題ありません。

www.ketancho.net

静的コンテンツ + CodeBuildに必要なファイルを作成する

 次にコンテンツ群を作成していきます。下記のような配置で、2つのファイルを作っていきます。

$ tree codecommit2S3/
codecommit2S3/
├── buildspec.yml
└── src
    └── index.html

1 directory, 2 files

index.html

 静的コンテンツを作成します。適当にこんな感じで作ってみました。このファイルの中身はなんでも大丈夫です。プロジェクト直下ではなく、 src 以下に配置するようにしてください。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8" />
    <title>CodeCommit2S3</title>
</head>
<body>
    <ul>
        <li>静的コンテンツをCodeCommitで管理する</li>
        <li>静的コンテンツはS3で静的ホスティングされる</li>
        <li>修正Pushがされたときに、自動的にS3にデプロイされると嬉しい</li>
    </ul>
</body>
</html>

buildspec.yml

 続いて、 CodeBuild によるビルド時のコマンドを設定する buildspec.yml を作成します。S3のバケット名は先ほど作成したものに置き換えてください。

version: 0.1

phases:
  build:
    commands:
      - aws s3 sync --delete src s3://(S3バケット名)

CodeCommit に Push する

 作成したプロジェクトを Git 管理し、CodeCommit にPushします。下記のコマンドは、プロジェクトルート( buildspec.yml と同じ階層)で行ってください。

$ git init
$ git remote add origin ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/VueSample
$ git add --all
$ git commit -m "first commit"
$ git push origin master

CodeBuild プロジェクトの作成

 まず、CodeBuild の画面から「プロジェクトの作成」を選択します。 f:id:ketancho_jp:20171209023835p:plain

 続いて、ビルド方法を設定していきます。下記のように選択してください。CodeCommit や S3 のパスについては、これまでに作成したものに置き換えてください。

f:id:ketancho_jp:20171209024349p:plain f:id:ketancho_jp:20171209024402p:plain f:id:ketancho_jp:20171209024417p:plain f:id:ketancho_jp:20171209024421p:plain

CodeBuild のロールに S3 の操作権限を付与する

 最終的には、CodeBuild によってS3へのリリースを行うのですが、現状S3を操作する権限が付与されていません。下記の流れで、 AmazonS3FullAccess ポリシーを付与してください。 f:id:ketancho_jp:20171209024814p:plain f:id:ketancho_jp:20171209024821p:plain f:id:ketancho_jp:20171209024818p:plain

CodePipeline の設定

 最後に、CodeCommit への Push をトリガに、CodeBuild が動作する流れを作っていきます。まず、「パイプラインの作成」を押してください。

f:id:ketancho_jp:20171209025814p:plain

 続いて、パイプラインの名前を決めます。これまで通り「CodeCommit2S3」としました。

f:id:ketancho_jp:20171209025817p:plain

 次に、トリガとなるリポジトリを指定します。最初に作成した CodeCommit のリポジトリを指定してください。 f:id:ketancho_jp:20171209025820p:plain

 ビルド方法を指定します。こちらも先ほど作成した、CodeBuild プロジェクトを指定します。 f:id:ketancho_jp:20171209025824p:plain

 デプロイ方法も指定することができます。今回は登場しませんが、CodeDeployというサービスを利用することができます。今回は指定せずに次に進みます。 f:id:ketancho_jp:20171209025828p:plain

 最後に、CodePipeline に付与する権限を割り当てます。標準のものを作成して割り当てればよいので、「ロールの作成」を押し、 f:id:ketancho_jp:20171209025832p:plain

開いた画面で何も変更せずに「許可」を押し、 f:id:ketancho_jp:20171209025835p:plain

戻ってきた画面で、作成したロールが割り当てられていることを確認した上で、「次のステップ」に進んでください。 f:id:ketancho_jp:20171209025839p:plain

CodePipeline の動きを確認する

初回起動

 これまでの流れで作成した CodePipeline の詳細を見てみると、初回のリリースが走っていることがわかります。下は、コードの更新を検知し終わり、ビルド中を表している画面です。

f:id:ketancho_jp:20171209025844p:plain

少し待つと、下記のように画面が更新され、リリースが完了したことがわかります。

f:id:ketancho_jp:20171209025847p:plain

 最初に作成したS3の静的ホスティングURLを見てみると、コンテンツが配置されていることが分かります。

f:id:ketancho_jp:20171209033016p:plain

プログラムを修正し、Pushする

 では、本題の動作確認です。 index.html を下記のように修正し、

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8" />
    <title>CodeCommit2S3</title>
</head>
<body>
    <ul>
        <li>静的コンテンツをCodeCommitで管理する</li>
        <li>静的コンテンツはS3で静的ホスティングされる</li>
        <li>修正Pushがされたときに、自動的にS3にデプロイされると嬉しい</li>
        <li>【これが見えれば成功!】</li>
    </ul>
</body>
</html>

コードを Push してみてください。

git add --all
git commit -m "fix"
git push origin master

 その後、CodePipeline が動作し始め、 f:id:ketancho_jp:20171209025851p:plain

リリースが完了した後に、再度URLを叩いてみると下記のように更新されていることが分かると思います。うまくいったでしょうか? f:id:ketancho_jp:20171209025859p:plain

まとめ

 コードの修正からリリースまでを一気通貫で行うことができるようになりました。HTML + CSS + Javascript のみので作られるLPサイトであれば、これで自動化できると思います。冒頭にも書きましたが、ビルドが必要になるフロントサイトの場合はもう一手間必要になりますので、これは別途書いていきたいと思います。

 このように無駄な手順を省くことで、開発に割く時間を最大化することができ、人力作業によるミスを減らすこともできます。CodeXXX サービスを積極的に取り入れて、エンジニアとしてのコア業務に時間を割いていければと思います。

 不明点、記載ミスなどがございましたら @ketancho までご連絡いただければと思います。

www.ketancho.net