Elastic Beanstalk のカスタムプラットフォームをアップデートする

Elastic Beanstalk

こんにちは、藤本です。

先日、Elastic Beanstalk にカスタムプラットフォームがリリースされ、EB アプリケーションで EB に最適化された独自 AMI を簡単に作成・利用することが可能となりました。カスタムプラットフォームについては下記エントリをご参照ください。

先日はカスタムプラットフォームを作成して、EB アプリケーションを作成するまでを実施してみましたが今回はアップデートを試してみました。

Elastic Beanstalk のプラットフォーム更新

Elastic Beanstalk のプラットフォームは事前設定済みプラットフォームとして、様々な言語、様々なミドルウェアが構成された AMI が提供されています。またそのプラットフォームは定期的に AWS によってアップデートされ、バージョン管理されています。アップデートされたプラットフォームを手動で適用することも、マネージドアップデート機能によりメンテナンスウィンドウを設けて自動適用することも可能です。(新規インスタンスとして置き換える)

プラットフォームのバージョンはメジャーバージョン、マイナーバージョン、パッチバージョンの 3レベルによって管理されます。例えば、バージョン1.2.3であれば、1がメジャーバージョン、2がマイナーバージョン、3がパッチバージョンとなります。各バージョンが表す意味は公式ドキュメントに分かりやすく記載されています。

メジャーバージョンは後方互換性のない変更についてのみ使用されます。マイナーバージョンは Elastic Beanstalk の新機能のサポートが追加されたこと、パッチバージョンはバグの修正が行われたこと、OS かソフトウェアコンポーネントの更新が行われこと、更新されたパッケージ(Amazon Linux yum リポジトリにある)にアクセスできるようになったことを意味します。 Elastic Beanstalk 環境のプラットフォームバージョンの更新

各バージョンレベルに合わせて自動更新を適用するか指定することができます。例えば、マイナーバージョン、パッチバージョンの更新は自動適用、メジャーバージョンの更新は手動適用するなど。

カスタムプラットフォームの更新

一方、カスタムプラットフォームの場合どうなるのでしょうか?公式ドキュメントでは情報を見つけることができませんでしたので調べてみました。

カスタムプラットフォームの自動更新

カスタムプラットフォームは利用者が独自で作っているため、自動でアップデートされることはありません。当たり前といえば当たり前ですが。例えば、ミドルウェアにセキュリティホールが見つかったら、パッチ適用したバージョンのミドルウェアをインストールしたプラットフォームに更新する必要があります。

カスタムプラットフォームのバージョン管理

カスタムプラットフォームは更新するたびにバージョン番号をインクリメントしてくれます。ebp createのオプションにより、メジャーバージョン、マイナーバージョン、パッチバージョンのいずれかの番号をインクリメントするか選択することができます。何も指定しないデフォルト動作ではパッチバージョンがインクリメントされます。また、絶対値でバージョン番号を指定することも可能です。

カスタムプラットフォーム更新時の EB アプリケーションへの自動適用

先ほどご紹介したマネージドアップデート機能はカスタムプラットフォームでは利用できません。カスタムプラットフォームを利用した EB アプリケーションはマネージドアップデートの設定や履歴のメニューが表示されません。こちらは実装してほしいですね。

試してみた

それでは試してみましょう。今回も前回のエントリで試したサンプルのカスタムプラットフォーム Node.js on Nginx on Amazon Linux を利用します。カスタムプラットフォームを更新して、カスタムプラットフォームを利用している EB アプリケーションに更新したカスタムプラットフォームを適用してみます。流れとしては下記図のようになります。

update-custom-platform

手順としては、下記の 2つだけです。

  1. ebp createでカスタムプラットフォームを更新
  2. eb upgradeで EB アプリケーションに更新したカスタムプラットフォームを適用

今回も EB CLI を利用して、試しています。

現状

既に何回か更新していて、現在のカスタムプラットフォームの最新バージョンは1.0.7です。

$ ebp list
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.7  Status: Ready
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.6  Status: Failed
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.5  Status: Failed
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.4  Status: Failed
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.3  Status: Ready
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.2  Status: Ready
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.1  Status: Ready
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.0  Status: Ready

今回はカスタムプラットフォームのビルドに httpd のインストールを追加します。現在、EB アプリケーションのインスタンスに httpd は未インストール状態です。

$ rpm -q httpd
package httpd is not installed

カスタムプラットフォームの更新

ビルド用スクリプトに httpd のインストールコマンドを追加します。

今回はカスタムプラットフォームのバージョンをマイナーバージョンを上げて、1.1.0として更新します。ebp createコマンドのオプションに--minor-incrementを指定します。

$ ebp create --minor-increment
WARNING: You have uncommitted changes.
Creating application version archive "app-769f-170319_013849".
Uploading NodePlatform_AmazonLinux/app-769f-170319_013849.zip to S3. This may take a while.
Upload Complete.
Note: An environment called 'eb-custom-platform-builder-packer' has been created in order to build your application. This environment will not automatically be terminated and it does have a cost associated with it. Once your platform creation has completed you can terminate this builder environment using the command 'eb terminate'.
INFO: createPlatform is starting.
INFO: Initiated platform version creation for 'NodePlatform_AmazonLinux/1.1.0'.
INFO: Use existing Packer builder environment 'eb-custom-platform-builder-packer'.

<<snip>>

INFO: Successfully built AMI(s): 'ami-0eb23a6e' for 'arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.1.0'
INFO: Packer built AMIs: ami-0eb23a6e.
INFO: Successfully created platform version 'NodePlatform_AmazonLinux/1.1.0'.

バージョン1.1.0が作成されました。

$ ebp list
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.7  Status: Ready
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.1.0  Status: Ready
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.6  Status: Failed
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.5  Status: Failed
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.4  Status: Failed
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.3  Status: Ready
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.2  Status: Ready
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.1  Status: Ready
arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.0  Status: Ready

EB アプリケーションの新規カスタムプラットフォームを適用

カスタムプラットフォームを利用した EB アプリケーションの更新も、事前設定済みプラットフォームの更新と同様です。注意点としては、GUI からは更新できませんでした。eb upgradeコマンドを利用します。

$ eb upgrade

The environment "fujimoto-nodejs" will be updated to use the most recent platform version.
Current platform: arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.0.7
Latest platform:  arn:aws:elasticbeanstalk:us-west-2:xxxxxxxxxxxx:platform/NodePlatform_AmazonLinux/1.1.0

WARNING: This operation replaces your instances with minimal or zero downtime. You may cancel the upgrade after it has started by typing "eb abort".
You can also change your platform version by typing "eb clone" and then "eb swap".

To continue, type the environment name: fujimoto-nodejs
Printing Status:
INFO: Environment update is starting.

<<snip>>

INFO: Attached new instance(s) to the permanent auto scaling group awseb-e-ecjkzfpvvp-stack-AWSEBAutoScalingGroup-21N9OBXEU6OR.
INFO: Starting post-deployment configuration on new instances.
INFO: Waiting for post-deployment configuration to complete.
INFO: Created Auto Scaling launch configuration named: awseb-e-ecjkzfpvvp-stack-AWSEBAutoScalingLaunchConfiguration-JIUDGKZY7A8E
INFO: Deleted Auto Scaling launch configuration named: awseb-e-ecjkzfpvvp-stack-AWSEBAutoScalingLaunchConfiguration-1BNHVLYEVED07
INFO: Deployment succeeded. Terminating old instances and temporary Auto Scaling group.
INFO: Removed instance [i-027a3cb751499d468] from your environment.

ログから AutoScaling グループにインスタンスを追加して、旧インスタンスを削除したことがわかります。

AMC から確認しても、EB アプリケーションにバージョン1.0.7から

fujimoto-nodejs_-_Dashboard

バージョン1.1.0が適用されていることがわかります。

fujimoto-nodejs_-_Dashboard 2

動作確認

新規作成されたインスタンスへログインして、httpd のインストール状況を確認します。

$ rpm -q httpd
httpd-2.2.31-1.8.amzn1.x86_64

無事インストールされています。

まとめ

いかがでしたでしょうか? カスタムプラットフォームを利用することでコードベースでインフラを管理でき、プラットフォームのアップデートも、アップデートしたプラットフォームの適用もコマンド一発で簡単にできました。更には EB の豊富なデプロイ方式を利用することでゼロダウンタイムアップデート、ロールバックを容易に行うことができるのは非常に嬉しいところです。

参考リンク