AWSで学ぶコンテナの基礎 (2) イメージ自動生成

前回でイメージ作成のためのコードができましたが、ビルドとかアップロードを手作業でやる時代ではないので、自動化してしまいます。

自動処理を実行している間は、変に別の仕事しようとしないで、インターネットを徘徊したり、オヤツ食べたりトイレに行けばいいんです。安定なシステムは、平穏な心が生み出すのです。そういうものです。



目次

(0) はじめに
(1) Docker
(2) イメージ自動生成 ← イマココ!
(3) サービス起動
(4) デプロイ
(5) Auto Scaling
(6) 費用と性能


CodeCommitでコード管理

組織ごとにコード管理を何でやっているかは様々でしょうが、AWSでのイメージ管理程度ならば Code なんちゃらを使ってしまうのがベターです。まずはイメージ作成用コードを CodeCommit で管理する場を整えます。

進行図

まだまだ序盤なり。



Terraform で CodeCommit 作成

ここから Terraform でのリソース作成が出現しますが、コードは私の手元のそのままコピペするので、local変数やWorkspace多用のため、そのままは動きません。参考程度に各自改変してください。

まずは1つめのイメージ base から。


IAM UserによるSSH接続設定

CodeCommitレポジトリにアクセスするためには、いくつかの方法が下記に示されているのですが、
  • CodeCommit のセットアップ

  • ここではLinuxからSSH接続する方法で準備します。
  • Linux, macOS, or Unix 上で CodeCommit リポジトリに SSH 接続するために必要なセットアップ手順

  • コードをアップロード

    作業スペースができたので、早速Dockerコードをアップロードします。前回取得済みのベース用コードをガバっともってきて、デフォルトブランチとして置いておきます。



    ECRリポジトリ作成

    前回はCLIでECRリポジトリを作成して遊びましたが、terraform で作成します。


    進行図

    インターネッツがもったいないので省略。


    CodeBuild でイメージ作成とアップロード

    ここでようやく、コードに入っていた buildspec.yml が活躍します。CodeBuildは、指定したソースコードに入っている buildspec.yml の内容を実行するサービスです。今回は CodeCommit ですが、GitHub なども利用可能です。CodeCommitのDocker用コードを取得し、buildspec.yml に従ってイメージをビルドし、ECRにアップロードする、までを CodeBuild に任せます。

    進行図

    ようやくシステマチックになってきました。



    Role作成

    まずは、CodeBuild がいろいろ作業するために必要な Role を作成しておきます。

    長いですが、たいした内容ではないです。ECR周りはポリシーがあるのでアタッチしていますが、それ以外はちょうどよいのがないのでバラで指定しています。なんとなく、そのへんを使うんだーって眺めてもらえればよいです。

    CloudWatch Logs

    CodeBuild が実行した際の出力内容は Logs に吐き出されます。明示的に作らなければ勝手にロググループを作ってくれますが、それだと保持期限が無期限になってしまうので、自分で作成します。


    CodeBuild 作成

    複雑なサービスではどれもそうなんですが、管理画面でポチポチして作成すると、具体的にどんなリソースが勝手に作成されて、どんなリソースが関わってて、どんなオプションがあるのかが非常にわかりづらいと感じます。それでとりあえず動くのを楽しむだけならいいのですが、安心安全に運用するとなれば話は別です。

    Terraform で作成すると、関わるリソースの把握がしやすく、Terraformのドキュメントを見ると設定項目がほぼ全て一覧で見れるので、下手にAWSドキュメントを文章で読むよりも理解が早かったりします。とくに、この Code なんちゃら系はお互いが絡むので Terraform での理解がおすすめです。

    source で CodeCommit を指定し、
    compute_type と image で処理をさせるイメージと性能を指定し、
    environment_variable で buildspec.yml に渡す環境変数を列挙しています。

    vpc_config でVPC内で処理できたりもしますが、その場合は Lambda と同じで NAT G/W が必要になったりするので、不要なら書かないでよいです。buildspec.yml の位置を変えたりもできますが、まぁ不要でしょう。


    buildspec.yml を見てみる

    難しいことは特になく、ビルドのフェーズごとにスクリプトを記述するだけです。

    前回 Docker で遊んだ最後の内容をやってもらっているだけです。
    Docker login し、
    current にある Dockerfile で build して tag 付け、
    ECR に push して終了です。

    ↑ではStartとFinishで日付を出力していますが、CloudWatch Logs でタイムスタンプがでるので実は不要だったりします。気分です気分。

    CodeBuildを実行してみる

    CodeBuild 管理画面で、「Start build」をポチって動かしてみます。一発で成功するほど甘いものではない気がしますが、Build history を見て失敗したら処理内容を確認し、原因を解決していきます。

    成功したら、ECR のリポジトリを覗いてみましょう。latest の更新時間が最新となっているはずです。


    CodePipeline で完全自動化

    CodeBuild で手動でポチッとするのも面倒くさい時代です。CodeCommit にて master にマージされた時点で、勝手に CodeBuild が動けば、なお幸せになれるはずです。CodeCommit をトリガーとして、CodeBuild を発火する CodePipeline を作成します。

    進行図

    自動化は心が洗われるのです・・・



    S3 を作成

    今回はそんなに気にする必要はないのですが、仕組み的に入出力アーティファクトのためにS3が必要になるのでバケットを作ります。気になる人はCodePipeline について軽く見ておくとよいです。
  • AWS CodePipeline とは

  • IAM Role を作成

    Pipelineさんが作業するために必要な権限を用意します。これといったポリシーが用意されていなく、ドキュメントから引っ張ってきた内容と、自前で追加したもので管理しています。


    CodePipeline を作成

    S3とRoleを使って、CodeCommit の masterブランチを発火元として、CodeBuild をぶっ放す Pipeline を作成します。


    動作確認

    手元のコードを編集し、CodeCommit に送り、master にプルリクしてマージ、まで行うと十数秒くらいで自動的にPipelineが動き始めるので、最後まで成功することを確認します。



    アプリケーション用のイメージも自動化する

    ここまでで1つ目のベースとなるイメージ作成の自動化ができました。次は、アプリケーション用のイメージ作成も自動化しておきます。が、内容はほぼ同じなので、省略して要点だけ記述しておきます。

    まず作成するリソースは、IAM や S3 など共通するものを除いた、base と書かれたTerraformコードをコピペして application 用を作成します。git grep base でだいたい対象がわかります。

    あとは、Dockerコードの FROM は、ECR用に変更する必要があります。

    あとは master へマージまで実行して動作確認するのは同じです。

    進行図




    イメージのコード化、イメージ生成の自動化、でそれっぽい風味がしてきましたが、まだ先は長い……

    次へまいります:サービス起動