背景
- CloudFormation を用いた ElasticBeanstalk のワーカーアプリケーション(Docker)構築時に、SQS のメッセージ数でオートスケールするように設定したい。(要は自動化。構築後にマネージメントコンソールや AWS CLI による手動設定はしたくない)
- ワーカー環境なのにデフォルトでは「NetworkOut、CPUUtilization、・・・」といった項目1 しか選択肢がない。
- 事前に作成した SQS を ebextensions 設定ファイル内で参照する方法が公式ドキュメントで見つからず、ebextensions 側でSQS のメッセージ数に対する CloudWatch Alarm を作成できない。(Elastic Beanstalk リソース2 に「AWSEBWorkerQueue」があるが、対象はアプリケーション起動時に自動作成させた場合に有効・・・だと思う)
- option_settings3 を使用する場合、あらかじめキュー名を設定ファイルに記述しておく必要があり、CloudFormation のスタック起動時に動的に指定するという要件に合わない。
解決方法
ポイントだけ示します。
CloudFormationテンプレート
"Resources": {
"MyConfigurationTemplate": {
"Type": "AWS::ElasticBeanstalk::ConfigurationTemplate",
"Properties": {
"OptionSettings": [
{
"Namespace": "aws:elasticbeanstalk:application:environment",
"OptionName": "MyOptionName", #パラメータ名
"Value": "MyOptionValue" #パラメータ値
}
]
}
}
}
ebextensions設定ファイル
Resources:
MyAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
Namespace: "AWS/SQS"
MetricName: ApproximateNumberOfMessagesVisible
Dimensions:
- Name: QueueName
Value:
"Fn::GetOptionSetting":
Namespace: "aws:elasticbeanstalk:application:environment" #CloudFormation側で指定した名前空間
OptionName: MyOptionName #CloudFormation側で指定したパラメータ名
DefaultValue: "" #とりあえず空文字列。この項目自体を消せないか?
独自パラメータを CloudFormation から ebextensions 設定ファイルに渡せることが確認できただけです。
実際に期待通りにオートスケールするかどうかはこれから検証予定ですので悪しからず。。
上記の設定に加えて Threshold もパラメータ化し、オートスケールすることが確認できました。 また、DefaultValue の項目は無くても動作しました。
補足
こちら4 の公式ドキュメントに組み込み関数「Fn::GetOptionSetting」の記述がありますが、関数に Namespace を指定できるとは書かれていないようです。なので、自分用のメモがてら投稿させていただきました。
Namespace を指定できるってことは、"aws:elasticbeanstalk:application:environment" 以外の名前空間も参照できるってことですかね?