処理終了後にEC2をTerminateする簡単な方法

記事タイトルとURLをコピーする

こんにちは、サービス開発チームの千葉です。
大雪と聞いてワクワクしていたのですが、江戸川橋はベチャベチャです。

さっそくですが『AWS Data Pipeline』や『Elastic MapReduce』を使うほどではないけれど
ローカル環境で実行するのは避けたい処理ってありませんか?
ちょっとした集計処理なんかがそれに当たると思います。

一昔前までは、ローカルで実行すると他の事がなにもできなくなるので
業務終了時にキックして、翌朝に結果を確認するってことをしていました。

クラウド時代の現在では、そんな処理は雲の上でやらせて他のことをします。
ささやかですが、これもクラウドならではの活用方法です。

とは言っても、インスタンス利用料が気になるところ。。。
ムダな出費を徹底して削るのはクラウドエンジニアの使命!
そこで、とっても簡単に処理終了時にインスタンスを『Terminate』する方法を考えてみました。

outline

簡単な流れとしては『IAM role(※)』を持ったEC2インスタンスにて集計処理を実行し
その結果をS3へ転送した後、Githubから取得したスクリプトにて自分自身を『Terminate』する。

となります。
それでは、早速はじめていきましょう。

(※:『IAM roles for EC2 Instance』については、こちらを参照ください)

IAM roleを作成する

Step1. メニューから『IAM』を選択
step_1


Step2. サイドメニューから『Roles』→『Create New Role』を選択
step_2


Step3. Role Nameに『foo(任意)』を入力
step_3


Step4. 『Amazon EC2』を選択
step_4


Step5. 『Administrator Access』を選択
step_5


Step6-7. 確認画面なので省略
step_6step_7


Step8. 作成されたroleを確認
step_8


IAM role付きのEC2インスタンスを起動する

基本的には通常のインスタンス起動の流れと同じですが
Advanced Instance Options画面の『IAM role』に、先程作成したroleを選択します。

step_9

これで『IAM role』を付与したEC2インスタンスが起動できました。 もう少しで下準備が終わりです。

Terminate用スクリプトの準備

EC2インスタンスにssh接続し、以下のコマンドを実行し
必要なパッケージのインストールと『Terminate』用のスクリプトの取得を行います。

sudo yum install -y git php php-amazon-sdk
git clone https://github.com/kachina/blog-20130206.git /tmp/foo

つかってみる

今回は公開できる集計処理がないので『sleep 1m』コマンドで代用します。
実際には『sleep 1m』の部分で集計処理を行ない、その結果をS3にアップしています。

sleep 1m; php /tmp/foo/terminate.php `curl http://169.254.169.254/latest/meta-data/instance-id`

集計処理後に『;』で区切り自分自身を『Terminate』するスクリプトを実行しています。

応用

『CloudInit(※)』と併用することで、もっと簡単に利用することが可能です。

以下のコードをAdvanced Instance Options画面の『User Data』に渡すことで
EC2インスタンスにssh接続することなく、先程の処理を実行することが可能です。

#!/bin/bash -ex
yum install -y git php php-amazon-sdk
git clone https://github.com/kachina/blog-20130206.git /tmp/foo
sleep 1m
php /tmp/foo/terminate.php `curl http://169.254.169.254/latest/meta-data/instance-id`
step_10

(※:『CloudInit』については『Amazon Linux起動時にCloudInitで設定するもの』を参照ください)

まとめ

"設定ファイル"や"ソースコード"を編集することなく、数コマンドで実現することができました。

今回は『Terminate』をテーマにしましたが、SNSで通知したり、SESでメール送信する等も簡単に実装可能です。 非常にシンプルなコードなので参考までに提示しておきます。

<?php
  require_once('AWSSDKforPHP/sdk.class.php');
  $ec2 = new AmazonEC2(array('default_cache_config' => '/tmp'));
  $ec2->set_region(AmazonEC2::REGION_APAC_NE1);
  $ec2->terminate_instances($argv[1]);

おしまい。