Elastic Beanstalk で EC2 オンデマンドキャパシティ予約を適用するには

2022.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

Elastic Beanstalk 環境にある EC2 インスタンスに対して、以下の利用資格で EC2 のオンデマンドキャパシティ予約を適用したいです。

インスタンスの利用資格:この予約を指定するインスタンスのみを受け入れます。

適格性:targeted

設定方法を教えてください。

どう対応すればいいの?

Elastic Beanstalk 環境の AutoScaling グループが使用する起動テンプレートにキャパシティ予約の設定を行う必要があります。

設定するためには、 .ebextensions 配下に以下の内容を記述した設定ファイル xxx.config をアプリケーションのソースコードに追加し、デプロイします。

Resources:
  AWSEBEC2LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateData:
        CapacityReservationSpecification: 
          CapacityReservationTarget:
            CapacityReservationId: cr-xxxxxxxxxxxxxxxxx

CapacityReservationId にはキャパシティの予約 ID を指定します。

やってみた

Elastic Beanstalk 用に用意されているサンプルコードをダウンロードし、.ebextensions 配下に設定ファイル(xxx.config)を配置し、デプロイ → EC2 インスタンスでキャパシティ予約が適用されていることを確認します。

おおまかな流れは以下になります。

  1. キャパシティ予約の作成
  2. AWS のドキュメントからサンプルコードをダウンロード
  3. .ebextensions 配下に .config ファイルを配置
  4. Elastic Beanstalk で環境を作成
  5. 作成された EC2 インスタンスにてキャパシティ予約が適用されていることを確認

キャパシティ予約の作成

キャパシティ予約を作成しました。

キャパシティ予約の作成については割愛します。詳細は以下ブログをご参照ください。
RIを購入せずに任意の期間でEC2のキャパシティを確保可能になりました

AWS のドキュメントからサンプルコードをダウンロード

以下のドキュメントからサンプルコードをダウンロードします。プラットフォームは Python で検証するため、Python のサンプルコードをダウンロードします。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/tutorials.html

.ebextensions 配下に .config ファイルを配置

先ほど作成したキャパシティ予約の予約 ID を CapacityReservationId に指定し ec2launchtemplate.config として保存します。

Resources:
  AWSEBEC2LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateData:
        CapacityReservationSpecification: 
          CapacityReservationTarget:
            CapacityReservationId: cr-06xxxxxxxxxxxxxxx

.ebextensions 配下に ec2launchtemplate.config を配置し、zip コマンドにてソースバンドルを作成します。

$ ls -al
drwxrwxrwx 1 root root 4096 Jul 2 16:39 .ebextensions/
-rwxrwxrwx 1 root root 612 May 30 2020 EBSampleApp-Python.iml*
-rwxrwxrwx 1 root root 4982 Jun 6 2020 application.py*
-rwxrwxrwx 1 root root 84 Jan 15 2020 cron.yaml*
$ cd .ebextensions/
$ ls -al
-rwxrwxrwx 1 root root 215 Jan 15 2020 00sample_log.config*
-rwxrwxrwx 1 root root 246 Jul 2 16:39 ec2launchtemplate.config*
$ cd ..
$ zip ../python-myapp.zip -r * .[^.]*
  adding: EBSampleApp-Python.iml (deflated 47%)
  adding: application.py (deflated 60%)
  adding: cron.yaml (deflated 24%)
  adding: .ebextensions/ (stored 0%)
  adding: .ebextensions/00sample_log.config (deflated 53%)
  adding: .ebextensions/ec2launchtemplate.config (deflated 43%)
$

Elastic Beanstalk で環境を作成

Elastic Beanstalk で検証用の環境を作成します。
先ほど作成した「python-myapp.zip」を選択してアップロードを実施します。
今回は検証のため AZ(アベイラビリティーゾーン) を指定したいため、「より多くのオプションの設定」でカスタム設定を追加します。

EC2 インスタンスタイプおよび AZ を指定したいため、容量の変更を行います。 環境タイプを負荷分散に変更 インスタンスタイプは t2.micro のみに指定 AZ は ap-northeast-1a を指定

上記設定で「保存」→「環境の作成」を押下し Elastic Beanstalk 環境の作成完了まで待ちます。

作成された EC2 インスタンスにてキャパシティ予約が適用されていることを確認

EC2 インスタンスが作成され、キャパシティーの予約 ID に先ほど作成したキャパシティ予約が適用されていることを確認しました。

キャパシティ予約の画面でも、利用可能な数量が 0 になっており、EC2 インスタンスに適用されていることを確認しました。

参考資料

Elastic Beanstalk 環境リソースの追加とカスタマイズ - AWS Elastic Beanstalk

Elastic Beanstalk が環境向けに作成するリソースを変更する - AWS Elastic Beanstalk

コマンドラインからソースバンドルを作成する - AWS Elastic Beanstalk

AWS::EC2::LaunchTemplate CapacityReservationSpecification - User Guide