Elastic Beanstalkでもスポットインスタンスを使いたい

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

はじめに

AWSチームのすずきです。

Amazon EC2 スポットインスタンス、EC2を入札によりオンデマンド費用と比較すると、 70〜80%オフの価格で利用する事が可能です。

AWS Elastic Beanstalkは、AWSにより提供されるアプリケーション環境の構築、管理サービスですが、 起動するEC2として、スポットインスタンスを利用する手段が提供されていませんでした。

今回、Elastic Beanstalkアプリケーション環境、そのコスト削減のため、スポットインスタンス化を 試みてみました。 非公式な手順ですがその内容を紹介させていただきます。

注意

  • 当記事、AWS 公式ドキュメントには記載されていない事項を含みます。
  • 仕様変更などで挙動が変わる可能性もあるため、ご利用は自己責任でお願いします。(2016/04月現在)

1)「.ebextentions」

AWS Elastic Beanstalk 設定ファイルを、ディレクトリ「.ebextensions」以下に 配置する事で、AWSリソースのカスタマイズが可能です。

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

「LaunchConfiguration」ではCloudFormationに準じたEC2インスタンスの起動設定が可能です。

AWS::AutoScaling::LaunchConfiguration

「AWSEBAutoScalingLaunchConfiguration」のプロパティとして 「SpotPrice」に1時間あたりの入札希望金額を指定しデプロイを行うと、スポットインスタンスでの起動が確認できました。

eb-spot-05

サンプル

  • ファイル名「.ebextensions/ec2-spot.config」
  • 入札金額:0.01USドル指定
Resources:
  AWSEBAutoScalingLaunchConfiguration:
    Type: "AWS::AutoScaling::LaunchConfiguration"
    Properties:
      SpotPrice: "0.01"

スポット価格について

今回、t1.microインスタンスを0.01$、オンデマンド費用の0.026$の38%で入札しましたが、 実際の課金は、需要に応じて変動するスポット価格の金額となります。

東京リージョン、1ヶ月間のt1.microスポットインスタンスの価格は、0.0031〜0.0033$でした。

eb-spot-06

1ヶ月、750時間、t1.microを稼働させた場合のインスタンス費用、 0.0032(スポット価格単価の平均) × 750(時間)= 2.4 USドル オンデマンドの88%引に相当する金額で、EC2インスタンスを利用する事ができました。

2)CloudFormation

AWS Elastic Beanstalk はCloudFormation経由で環境設置が可能です。

launchconfigurationは、OptionSettingsとして指定可能ですが、 「SpotPrice」は CreateStackの際にvalidation 例外が発生し、 Elastic Beanstalk設定にスポットインスタンス指定を含める事は出来ませんでした。

eb-spot-04

サンプル抜粋(無効)

        "Type": "AWS::ElasticBeanstalk::Environment",
          "OptionSettings": [
              "Namespace": "aws:autoscaling:launchconfiguration"
              "OptionName": "SpotPrice",
              "Value": "0.001"

3)Launch Configurationの差替

AWS Elastic Beanstalk で環境を構築すると、EC2のオートスケール設定として

  • 起動設定(Launch Configuration)
  • Auto Scaling グループ(Auto Scaling Group)

が生成されます。

2014年のアップデートにより、起動設定のコピーが作成可能となりました。

AWS Auto Scaling新機能 – 既存EC2インスタンスの活用を試してみた

当機能を利用し、Beanstalk環境のスポットインスタンス化を試みてみました。

起動設定差替手順

起動設定のコピー

  • コピー元となる起動設定を指定し、コピーを行います。

eb-spot-07

インスタンスの詳細設定

  • 「スポットインスタンスのリクエスト」をチェックし、最大価格に入札希望額を反映します。

eb-spot-08

ストレージ設定

  • Elastic Beanstalkの起動設定をコピーした場合、ストレージ設定は必須です。

eb-spot-09

Auto Scaling グループ設定

  • Auto Scaling グループを編集し、コピーした起動設定に差替を行います。
  • 以後該当オートスケール環境で起動するEC2は、スポットインスタンスになりました。

eb-spot-10

コスト削減効果

今回、7割のインスタンスをオンデマンドからスポットに置き換えを実施した環境、 EC2のインスタンスの使用状況レポートで確認すると、 1日あたりのEC2利用費は、およそ66%の削減を確認できました。

eb-spot-03-2

注意

  • 今回紹介した手順、Elastic Beanstalk、AmazonLinux201603、PHP5.6環境で動作を確認できましたが、非公式な内容となります。
  • アプリのデプロイなどに問題が生じたり、設定上書きなどに伴う不整合なども予想されますので、自己責任での利用をおねがいします。

まとめ

Elastic Beanstalkで提供されるオートスケール環境下でスポットインスタンスを利用する事で、 その相性の良さと、高いコストパフォーマンスを実感する事ができました。

AWS、クラウドならではサービスとなっているEC2のスポットインスタンス、 Elastic Beanstalkの正式対応を期待して待ちたいと思います。

また、スポットインスタンスの導入にあたり、スポット相場の暴騰によるサービスダウンを回避するため、 Elastic Beanstalk環境間の負荷分散、オンデマンド環境側のオートスケール設定の最適化、ターミネート通知との連携などを試みています。 こちらは別の機会に紹介させて頂きたいと思います。