AWS Elastic Beanstalk(以下、Beanstalk)のプラットフォームフックという機能に用意されている "confighooks" と "hooks" について、違いが気になったので簡単な検証を行い挙動を調べてみました。
プラットフォームフックとは
BeanstalkのLinuxプラットフォームを拡張するための機能で、特定ディレクトリに配置したファイルを特定のタイミングで実行可能です。
具体的には、アプリのソースバンドルの ".platform/confighooks" あるいは ".platform/hooks" ディレクトリ配下にサブディレクトリを作成し、
そのサブディレクトリに実行したいファイルを配置して利用します。
サブディレクトリ名には「prebuild」「predeploy」「postdeploy」のいずれかが使用でき、それぞれ実行タイミングが異なります。
サブディレクトリに配置するファイルとしては、バイナリファイルや#!行で始まるスクリプトファイル(#!/bin/bash など)が使用可能です。
confighooksとhooksの違い
AWSの公式ドキュメントを参照したところ、以下のような違いがあるようです。
- confighooks
環境インスタンスを再作成せずに更新だけする設定変更を行った場合に実行されます。 - hooks
デプロイ用の新しいソースバンドルを提供する場合、またはすべての環境インスタンスの終了および再作成が必要な設定の変更を行う場合に実行されます。
動作検証
設定変更の観点からconfighooksとhooksの違いを確かめるために、簡単な検証を行ってみます。概要は以下の通りです。
- 「.platform/confighooks」と「.platform/hooks」に実行ファイルを配置してBeanstalkにデプロイ
- AWS CLIのコマンドを実行して、インスタンスの再作成が発生しないBeanstalkの設定変更を行い、confighooksの挙動を確認
- AWS CLIのコマンドを実行して、インスタンスの再作成が発生するBeanstalkの設定変更を行い、hooksの挙動を確認
1. 準備
- 下記のファイルを任意のアプリのソースバンドルに用意
サブディレクトリは「predeploy」でなくてもかまいません。
- .platform/confighooks/predeploy/01_test.sh
#!/bin/bash
echo "***confighooks***"
- .platform/hooks/predeploy/01_test.sh
#!/bin/bash
echo "***hooks***"
-
ソースをBeanstalkへデプロイ
任意の設定でBeanstalkのEnvironmentを作成し、先ほどのソースをデプロイします。
デプロイは別途作成したAWS CodePipeline経由で行いました。 -
Beanstalkの設定変更用ファイルを作成
任意の作業ディレクトリに下記ファイルを作成しておきます。
confighooksの確認ではBeanstalkの環境変数の設定を変更します。 hooksの確認ではBeanstalkのAMIの設定を変更します。- options_test_confighooks.json
[
{
"Namespace": "aws:elasticbeanstalk:application:environment",
"OptionName": "DUMMY",
"Value": "dummy"
}
]
- options_test_hooks.json
[
{
"Namespace": "aws:autoscaling:launchconfiguration",
"OptionName": "ImageId",
"Value": "ami-XXXXXXXXXXXXXXXXX"
}
]
- confighooksの挙動確認
今回はローカル環境の作業ディレクトリからAWS CLIのコマンドを実行してBeanstalkの設定変更を行います。
まずはconfighooksからです。下記を実行します。
# 以降Bash上での実行を想定
AWS_PROFILE="AWS CLIで使用するAWSプロファイル"
ENVIRONMENT_NAME="BeanstalkのEnvironment Name"
INPUT_FILE_NAME=options_test_confighooks.json
# Beanstalkの設定を更新
aws elasticbeanstalk update-environment --environment-name ${ENVIRONMENT_NAME} --option-settings file://${INPUT_FILE_NAME} --profile ${AWS_PROFILE}
AWSマネージメントコンソールでBeanstalkの設定更新が完了していることを確認し、対象インスタンスに接続して、 /var/log/eb-hooks.log を確認します。
...
YYYY/MM/DD XX:XX:XX.XXXXXX [INFO] Running command: .platform/confighooks/predeploy/01_test.sh
YYYY/MM/DD XX:XX:XX.XXXXXX [INFO] ***confighooks***
...
.platform/confighooks/predeploy/01_test.sh の実行が確認できました。
3. hooksの挙動確認
続いてhooksです。下記を実行します。
# 以降Bash上での実行を想定
AWS_PROFILE="AWS CLIで使用するAWSプロファイル"
ENVIRONMENT_NAME="BeanstalkのEnvironment Name"
INPUT_FILE_NAME=options_test_hooks.json
# Beanstalkの設定を更新
aws elasticbeanstalk update-environment --environment-name ${ENVIRONMENT_NAME} --option-settings file://${INPUT_FILE_NAME} --profile ${AWS_PROFILE}
AWSマネージメントコンソールでBeanstalkの設定更新が完了していることを確認し、confighooks同様 /var/log/eb-hooks.log を確認します。
...
YYYY/MM/DD XX:XX:XX.XXXXXX [INFO] Running command: .platform/hooks/predeploy/01_test.sh
YYYY/MM/DD XX:XX:XX.XXXXXX [INFO] ***hooks***
...
.platform/hooks/predeploy/01_test.sh の実行が確認できました。
まとめ
.platform/confighooks/
インスタンスの再作成が発生しない設定変更時に実行されることが確認できました。
.platform/hooks/
インスタンスの再作成が発生する設定変更時に実行されることが確認できました。
両者の使い分けや有効な活用方法については、実際に使用しながら理解を深めていきたいと思います。