[re:Invent 2019] EC2 Image Builder で S3 からコンテンツをデプロイしてみた #reinvent

こんにちは、コンサル部の望月です。

先程、Image Builder のコンポーネントを作成してみたというブログを書きました。

[re:Invent 2019] EC2 Image Builder でコンポーネントを作成してみた #reinvent

引き続き、Image Builder を触ってみているところ、以下ドキュメントでサポートされているアクションモジュールで S3Download モジュールがあったため、S3 にコンテンツ配置して、デプロイできるんじゃね?と思ったのでやってみました。

Supported Action Modules - Amazon Elastic Compute Cloud Image Builder

やってみた

S3 バケットにコンテンツの配置

自分の S3 バケットにコンテンツの配置をします。

ここでは <バケット名>/contents/ 配下に index.html などを配置しています。

コンポーネントのバージョンアップ

初期の作成は、最初に紹介した私のブログを参照してください。

ここでは、せっかくなので作成済みのコンポーネントのバージョンアップを行ってみます。

  • 作成済みの『ApacheInstall』を選択し、Actions から『Create new version』をクリック

  • Component version には任意のバージョンをつける
    • 前回『1.0.0』としていたので、今回は『1.0.1』を記入

  • Definition document に実行させたいコンテンツを記入する
    • 以下に実行したコンテンツになります
      • build
        • OSの最新化
        • Apache のインストール、有効化
        • コンテンツの配置
          • <バケット名> は自分の環境に合わせてください。
      • validate
        • パッケージがインストールされたかの確認
        • コンテンツが配置されたかの確認
      • test
        • 80 番ポートへ接続し、HTTPステータスコードが 200 を返すことを確認
name: Contents Deploy
description: This is Contents Deploy testing document.
schemaVersion: 1.0

phases:
  - name: build
    steps:
      - name: InstallLinuxUpdate
        action: UpdateOS
      - name: InstallApache
        action: ExecuteBash
        inputs:
          commands:
            - sudo yum install httpd -y
            - sudo systemctl enable httpd
            - sudo systemctl start httpd
      - name: ContentsDeploy
        action: S3Download
        maxAttempts: 3
        inputs:
          - source: s3://<バケット名>/contents/*
            destination: /var/www/html/

  - name: validate
    steps:
      - name: CheckApacheandContents
        action: ExecuteBash
        inputs:
          commands:
            - rpm -qi httpd
            - ls /var/www/html/*html

  - name: test
    steps:
      - name: TestContents
        action: ExecuteBash
        inputs:
          commands:
            - HTTP_STATUS=`curl -I localhost -o /dev/null -w '%{http_code}\n' -s`;  if [ $HTTP_STATUS -eq 200 ]; then echo $?; else echo $?; fi

  • 保存し、バージョン『1.0.1』のコンポーネントが追加されたことを確認します

IAMロールへ S3 へのアクセス権限を追加

また、Image Builderの実行に割り当てているIAMロールの権限にS3からコンテンツをダウンロードするため『AmazonS3ReadOnlyAccess』を追加する必要があります。

イメージパイプラインの作成

イメージパイプラインの作成時に先程バージョンアップしたコンポーネントを指定します

  • イメージパイプライン内の Build components から 『Browse Build components』をクリック

  • Select build components から検索条件を『Created by me』に変更し、それぞれのバージョンが表示されるため、バージョン『1.0.1』を選択

  • イメージパイプラインを作成したら『Run pipeline』を選択し、パイプラインを実行します

AMI の確認

EC2 サービスページから AMI が作成されていることを確認します。

  • AMI を確認し、起動する

  • 起動したインスタンスへアクセスし、デプロイしたコンテンツのページが表示されることを確認します

まとめ

EC2 Image Builder を使ってコンテンツのデプロイを行うことができました。

コンテンツの更新が少ないサイトで OS アップデートとコンテンツの更新が同じサイクルで変更できる場合などには、こちらの方法を使うことができそうです。

また、触ってて、Image Builder では複数のコンポーネントをひとつのイメージパイプラインで動かすことが可能っぽいので、今回の場合はコンテンツの更新と Apache のインストールを分けた形でコンポーネントを作成するのがよいかもしれません。

ひとつのイメージパイプラインで複数のコンポーネントを動かす方法などは、引き続き触っていきたいと思います。