« Webアプリケーションセキュリティについての社内勉強会を開いてみた(解答編) | メイン | AWS Lambdaを使ってRedshift料金を節約する »

2015年11月10日 (火)

AWS Lambdaを使ってEC2料金を節約する

エンジニアの佐藤です。こんにちは。
毎月のAWS(Amazon Web Service)の請求書を眺めていると、気が付くことがあります。請求金額のかなりの部分が「CPU料金」なのです。
EC2として直接買っているCPUだけでなく、Redshift、ElastiCache、RDSなどや、DynamoDBの帯域予約分もこれに該当するでしょう。何にせよ「CPUを構える」ことは、ストレージを構えるのに比べて高くつくのです。
一方で、こうして構えたCPUがどの程度仕事をしているのかというと、結構「暇」していることが多いのではないでしょうか。暇であろうとなかろうと、料金はかかります。
そんな折、AWS Lambda(以下Lambda)にスケジュール実行機能が追加されました。つまり「定時ジョブ」を、CPUを待機させることなく仕掛けることが可能になったのです。今回はこのLambdaを使って、EC2「夜間自動停止」機能を実装する手法をご紹介したいと思います。深夜早朝に全く利用がないと前提できるサーバは結構あるのではないでしょうか?今日からEC2料金を25%は節約できます。

基本的なアイディアは以下のようなものです。

  • LambdaからAWS APIを実行してEC2インスタンスの起動・停止を実行する。Lambdaの実行権限には必要な権限を設定する。
  • 起動と停止それぞれLambda Functionを登録し、開始時刻と停止時刻にLambda Functionが実行されるように設定する。
  • 起動・停止するインスタンスのIDは、設定変更できるようにLambda Functionの設定情報としてDescriptionに記載する。

今回のソースコードですが、GitHubの以下の公開レポジトリに掲載しています。
https://github.com/FLECT-DEV-TEAM/cloudblog20151110

(以下はお使いの環境にgitとNodeJS、zipコマンドがインストールされているものとして説明します。)
最初にこのレポジトリをクローンしてください。

$ git clone https://github.com/FLECT-DEV-TEAM/cloudblog20151110

次に依存パッケージのインストールを行います。

$ npm install

次にLambda Functionとして設定するアーカイブを作成します。

$ source package.sh

scheduletask-yyyyMMddhhmmss.zipというファイルができます。

これで準備は完了です。AWSマネジメントコンソールにログインしてLambda Functionを設定しましょう。今回はEC2インスタンスの起動用に「testStart」、停止用に「testStop」という2つのLambda Functionを作成します。

Lambda Functionの作成では以下のように設定します。(赤文字で注記を入れています。)

Screen_shot_20151110_at_125307


「Role」は、Lambda Function実行された際、AWSのリソースに対してどれだけの実行権限を有しているかを設定するものです。ここでは簡単に、以下のポリシーを設定したroleを設定します。(実運用上は広すぎる権限ですので、適宜調整してください。)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*",
                "ec2:*",
                "lambda:*"
            ],
            "Resource": "*"
        }
    ]
}

以上でLambda Functionの設定は完了です。次にこのLambda Functionをスケジュール起動するイベントの設定を行います。

作成したLambda Functionを選択し、Event sourcesタブで「Add event source」を選択します。

Img01


Event source typeに「Scheduled Event」を選択します。

Img02


Schedule expressionに「cron(0 22 * * ? *)」などと入力します。

Img03


時刻はUTCタイムゾーンで指定するのでこの場合は「毎日午前7時」の意味になります。表記法はcrontabに沿っていますが、5つ目の曜日指定のワイルドカードが「?」であること、crontabには存在しない6つ目の年指定ができることなどが異なっています。なお、最短時間間隔は5分となっています。

これで仕掛けは完了です。あとは指定時間になったらインスタンスの起動停止を確認し、CloudWatchのログを確認します。インスタンスの起動に成功した場合は以下のようなログがLambda Functionのロググループに書き残されるはずです。

START RequestId: XXX Version: $LATEST
2015-11-09T22:00:23.210Z XXX ["i-xxxxxxxx"]STARTED
2015-11-09T22:00:23.211Z XXX FINISH
END RequestId: XXX
REPORT RequestId: XXX Duration: 1502.21 ms Billed Duration: 1600 ms Memory Size: 128 MB Max Memory Used: 36 MB

この実行でいくら課金されるのでしょうか?AWS Lambdaの課金は回数と実行メモリ容量×実行時間の2つあり、 回数については以下のようになっています。

  • First 1 million requests per month are free
  • $0.20 per 1 million requests thereafter ($0.0000002 per request)

使用メモリが128MBの場合の実行課金は以下のようになっています。

  • 3,200,000 Free tier seconds per month
  • $0.000000208 per 100ms

今回は1インスタンスあたり起動と停止が1日に1回ずつと考えて、1日2回実行で128MB、3200msだとすると、1か月での料金は、 3200 / 100 x 31 x 0.000000208 = $0.0002 たったの0.02セント(約0.024円)です。 EC2のt2.microインスタンスなら36秒間で使い切ってしまう金額です。

筆者には、このAWS Lambdaという名の「コードフラグメント・ホスティング」は、物理サーバ → 仮想サーバ → コンテナと続く一連の流れの最先端のように思えます。今後はVPC対応が実施される予定でVPC内のRDSやElastiCacheとも連携しやすくなります。実装やデプロイの難しさはありますが、急速に広まっていくのではないでしょうか。

コメント

「次に依存パッケージのインストールを行います。

$ npm install 」
を実行すると
npm WARN EPACKAGEJSON ec2-user@1.0.0 No repository field.
が出ます。
原因は何でしょうか。
よろしくお願いします。

コメントを投稿

採用情報

株式会社フレクトでは、事業拡大のため、
・Salesforce/Force.comのアプリケーション開発
・HerokuやAWSなどのクラウドプラットフォーム上での
Webアプリケーション開発
エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみたい方、
是非ご応募下さい。

フレクト採用ページへ

会社紹介

株式会社フレクトは、
認定コンサルタント
認定上級デベロッパー
認定デベロッパー
が在籍している、セールスフォースパートナーです。
また、heroku partnersにも登録されています。
herokuパートナー
株式会社フレクトのSalesforce/Force.com
導入支援サービス
弊社の認定プロフェッショナルが支援致します。
・Visualforce/Apexによるアプリ開発
・Salesforceと連携するWebアプリ開発
も承っております。
セールスフォースご検討の際は、
お気軽にお問合せください。

2022年5月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
ブログ powered by TypePad