Amazon Web Services ブログ

最新リリース: AWS Elastic Beanstalk でカスタムプラットフォームのサポート開始

by AWS Japan Staff | on | in AWS Elastic Beanstalk |

うれしいお知らせです。AWS Elastic Beanstalk でカスタムプラットフォームを作成できるようになりました。この最新リリースの AWS Elastic Beanstalk により、開発者やシステム管理者は、AWS Elastic Beanstalk のカスタムプラットフォームイメージを独自に作成して管理し、インスタンス設定を完全にコントロールできます。ご存じのように、AWS Elastic Beanstalk は、一般的なウェブプラットフォームでウェブアプリケーションやサービスをデプロイ、スケーリングするためのサービスです。このサービスでは、ユーザーがコードをアップロードするだけで、デプロイメント、容量のプロビジョニング、負荷分散、Auto Scaling が自動的に処理されます。

これまでの AWS Elastic Beanstalk で提供していたのは、事前設定済みのプラットフォームのセットです。さまざまなプログラミング言語、Docker コンテナ、上述した用途別のウェブコンテナの設定が複数用意されていました。Elastic Beanstalk では、選択された設定に従って、1 つ以上の Amazon EC2 インスタンスで対象のアプリケーションを実行するためのソフトウェアスタックやリソースをプロビジョニングしていました。この最新リリースでは、独自のカスタマイズした Amazon Machine Image (AMI) からプラットフォームを作成できます。カスタムイメージは、サポートされているオペレーティングシステム (Ubuntu、RHEL、Amazon Linux) のいずれかで構築できます。これらの特化された Elastic Beanstalk プラットフォームの作成作業は、マシンイメージ作成ツールの Packer で簡素化できます。Packer は、すべての主要オペレーティングシステムで実行するオープンソースツールであり、1 つの設定から複数のプラットフォームのマシンイメージやコンテナイメージを作成できます。カスタムプラットフォームでは、Elastic Beanstalk 環境全体にわたり、標準化とベストプラクティスを適用して管理できます。たとえば、Ubuntu や Red Hat Enterprise で独自のプラットフォームを作成し、Elastic Beanstalk で現在サポートされていない言語やフレームワーク (Rust、Sinatra など) を使用してインスタンスをカスタマイズできます。

カスタムプラットフォームの作成
カスタムプラットフォームを作成するには、最初に Packer テンプレートを作成します。Packer テンプレートを作成したら、プラットフォーム定義ファイルの platform.yaml ファイル、プラットフォームのビルダータイプを定義するプラットフォームフック、およびスクリプトファイルを作成します。これらのファイルが準備できたら、プラットフォーム定義アーカイブと呼ばれる zip アーカイブファイルを作成して、これらのファイル、関連するスクリプト、その他 Amazon Machine Image (AMI) の構築に必要な追加のアイテムをパッケージ化します。プラットフォーム定義アーカイブを構築するための基本的なフォルダ構造は以下のとおりです。

|– ビルダー カスタムプラットフォームを作成するために Packer で使用するファイルを収容
|– custom_platform.json Packer テンプレート
|– platform.yaml プラットフォーム定義ファイル
|– ReadMe.txt サンプルの説明

Elastic Beanstalk の新しいカスタムプラットフォーム機能を詳しく知るには、実際に試してみるのが最善です。Packer を使用してカスタム AMI とプラットフォームを構築してみましょう。まず、カスタム Packer テンプレートを構築します。Packer サイトにアクセスし、Packer ツールをダウンロードして、このバイナリが環境パスに追加されたことを確認します。

次にテンプレートを構築しましょう。Packer テンプレートは、構築するイメージを定義するための JSON 形式の設定ファイルです。Visual Studio を開いて、これを IDE として使用し、Packer テンプレートを構築するための新しい JSON ファイルを作成します。

Packer テンプレート形式には、イメージのさまざまなコンポーネント用に設計されたキーのセットがあります。以下のキーが提供されています。

  • variables (オプション): ユーザー変数を定義する 1 つ以上のキーと値の文字列
  • builders (必須): マシンイメージおよび各イメージの設定を作成するためのビルダーを定義する配列
  • provisioners (オプション): マシンイメージのソフトウェアをインストールおよび設定するための provisioner を定義する配列
  • description (オプション): テンプレートの説明としての文字列
  • min_packer_version (オプション): テンプレートの解析に必要な最小の Packer バージョンを示す文字列
  • post-processors (オプション): イメージの構築の完了後に行う後処理ステップを定義する配列

カスタム Elastic Beanstalk プラットフォーム用のカスタムイメージを作成する際に利用できるサンプルの Packer テンプレートについては、Elastic Beanstalk ドキュメントで有効な Packer テンプレートのサンプルを参照してください。テンプレートで、スクリプトの場所とスクリプトの実行に必要なコマンドの情報を指定し、ビルドスクリプトを実行するための provisioner を追加して Node をインストールします。完成した JSON ファイル、tara-ebcustom-platform.json は、以下のとおりです。

次に、構築した Packer テンプレートをコマンドラインで検証します。

幸いなことに、この Packer テンプレートはエラーになります。テンプレートに指定したスクリプト、eb_builder.sh がビルダーフォルダにあるとしたことが原因です。しかし、ビルダーフォルダは作成していません。また、シェルスクリプトを Packer テンプレートに指定してもいません。ファイルがエラーになって幸いだとは不信に思われるかもしれません。これが幸いだという理由は、Elastic Beanstalk サービスにテンプレートをアップロードする前に、テンプレート内のエラーやマシンイメージの構築に必要なファイルの不足を検出できるからです。ビルダースクリプトのフォルダとファイルを作成して、これらのエラーを修正することにします。Elastic Beanstalk ドキュメントに提供されているサンプルスクリプトを使用して、上記構造の Dev フォルダを作成します。カスタム Elastic Beanstalk プラットフォームの作成に関する限り、このサンプルスクリプトはプラットフォームフックと呼ばれます。プラットフォームフックは、ライフサイクルイベント中、および管理オペレーションに応じて実行されます。このカスタムプラットフォームの実装で使用したビルダースクリプトのサンプルを以下に示します。

このビルダーフォルダ構造には、カスタムプラットフォームを構築するためのビルダースクリプト、プラットフォームフック、その他の (プラットフォームスクリプトと呼ばれる) スクリプトが入っています。プラットフォームスクリプトは、環境変数や他のプラットフォームフック内の情報を取得するために使用できるシェルスクリプトです。プラットフォームフックは、ビルダーフォルダのサブフォルダ内にあり、その構造は以下のとおりです。

以上の Packer テンプレート、platform.yaml、ビルダースクリプト、プラットフォームフック、setup ファイル、config ファイル、プラットフォームスクリプトのすべてが、以下に示すビルダーフォルダ内のプラットフォーム定義を構成します。

サンプルの .yaml ファイルに提供されている platform.yaml を利用し、これを適切に変更してカスタム Elastic Beanstalk プラットフォームの実装に使用します。その結果として完成した platform.yaml ファイルは以下のとおりです。

version: "1.0"

provisioner:
  type: packer
  template: tara-ebcustom-platform.json
  flavor: amazon

metadata:
  maintainer: TaraW
  description: Tara Sample NodeJs Container.
  operating_system_name: Amazon linux
  operating_system_version: 2016.09.1
  programming_language_name: ECMAScript
  programming_language_version: ECMA-262
  framework_name: NodeJs
  framework_version: 4.4.4
  app_server_name: "none"
  app_server_version: "none"

option_definitions:
  - namespace: "aws:elasticbeanstalk:container:custom:application"
    option_name: "NPM_START"
    description: "Default application startup command"
    default_value: "node application.js"

この Packer テンプレートを再度コマンドラインで検証します。

後は EB CLI を使用してプラットフォームを作成するだけです。この機能は、EB CLI バージョン 3.10.0 以降で利用できます。EB CLI は、こちらからインストールできます。Elastic Beanstalk 開発者ガイドの指示に従ってください。EB CLI を使用してカスタムプラットフォームを作成するには、プラットフォーム定義アーカイブから抽出したファイルが含まれているフォルダを選択します。このフォルダについては、以下のステップを実行する必要があります。

  1. EB CLI を使用してプラットフォームリポジトリを初期化し、プロンプトに従う
    • eb platform init または ebp init
  2. テンプレートおよびスクリプトを使用して Packer 環境を起動する
    • eb platform create または ebp create
  3. IAM ロールがインスタンスに対して正常に作成されたことを検証する。このインスタンスプロファイルロールは、EB create プロセスを通じて自動的に作成されます。
    • aws-elasticbeanstalk-custom-platform-ec2-role
  4. プラットフォームの作成ステータスを検証する
    • eb platform status または ebp status

次にコマンドラインに移動し、eb platform init コマンドを実行して EB CLI コマンドでプラットフォームを初期化します。

次のステップとして、EB CLI を使用してカスタムプラットフォームを作成します。そのために、プラットフォームフォルダの短縮コマンド、ebp create を実行します。

成功! カスタム Elastic Beanstalk プラットフォームが作成されました。このプラットフォームをウェブソリューションとしてデプロイできます。カスタムプラットフォームを作成する際に重要な点は、Packer を実行する EIP を使用せずに、単一のインスタンス環境を起動することです。この環境は、必要に応じて複数のプラットフォームおよび各プラットフォームの複数のバージョンに再利用できます。さらに、カスタムプラットフォームはリージョン固有です。Elastic Beanstalk を複数のリージョンで使用する場合は、リージョンごとに別個のプラットフォームを作成する必要があります。

カスタムプラットフォームのデプロイ
カスタムプラットフォームを作成したら、AWS CLI または AWS Elastic Beanstalk コンソール経由でアプリケーションをデプロイできます。作成済みのカスタムプラットフォームを使用して環境を作成することは、Create New Environment ウィザードでのみ可能です。[Create a new environment] ウェブページで、[Platform] の [Custom Platform] ラジオボタンをオンにすると、作成済みのカスタムプラットフォームを選択できます。表示されるカスタムプラットフォームのリストから、前に作成したカスタムプラットフォームを選択します。

EB CLI で最新バージョンのカスタムプラットフォームをデプロイすることもできます。作成済みのカスタムプラットフォームをデプロイするためのコマンドラインは、以下のようになります。

  • eb deploy -p tara-ebcustom-platform

 

まとめ
Elastic Beanstalk のカスタムプラットフォームの構築は今すぐ開始できます。Elastic Beanstalk またはカスタムプラットフォームの詳細については、AWS Elastic Beanstalk 製品ページまたは Elastic Beanstalk 開発者ガイドを参照してください。

Tara