フォーム読み込み中
クラウドサービスは非常に便利です。Webブラウザにてクラウドサービスのコンソールからボタンを数回クリックするだけで、仮想コンピューティングを立ち上げたり、停止したりすることができます。
一方で、仮想コンピューティングは使い続けるけど、例えば深夜や、土日とか使ってない時間帯は課金したくないですよね?その場合はコンソールから手動操作で仮想コンピューティングを停止することができます。しかし、この作業もサービス起動&停止の都度WebブラウザでGUI操作をするため手間がかかります。サブスクリプションもしくはリザーブドインスタンスを購入すればいい、という解決策もありますが、仮想コンピューティングでないプロダクトサービス、例えばRDSやRedshiftなど、プロダクトサービスによってはこまめにサービス起動&停止しながら利用したほうが、サブスクリプションもしくはリザーブドインスタンスを購入するより安く済む場合もあります。
そんなユーザー向けに、本記事は、AWSのLambdaとPythonを使って、簡単にEC2インスタンスを一定時刻に自動起動&自動停止する方法をご紹介します。
これを応用すれば、RDSやRedshiftに対し一定時刻に起動&停止することや、Slackから入力することで仮想コンピューティングを自動起動&停止、CPU使用率の変動推移が1時間以上0%であれば仮想コンピューティングを自動停止、NWトラフィックが高くなったら仮想コンピューティングを自動起動、DBが障害になったらDBを素早くフェイルオーバー、などサーバレスによる様々な自動起動・停止処理を行うことができます。
AWS Lambdaを使った、EC2インスタンスの自動起動・停止方法の流れおよび全体像は次の図の通りになります。
Lambdaを使ってEC2インスタンスの自動起動・停止を実現するにあたって、事前準備としてIAM PolicyとRoleを設定します。IAM PolicyはLambdaが指定時刻にEC2インスタンスを起動&停止するための操作権限、RoleはLambdaの対象サービスがその操作を許可するための権限です。
2.1 AWSコンソール画面のIAM画面にて、IAM PolicyとRoleを作成します。
2.1.1 IAM Policyの作成
以下は設定するポリシーのサンプル例です。
policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:Start*",
"ec2:Stop*"
],
"Resource": "*"
}
]
}
2.1.2 IAMのRoleを作成します
2.1.3 EC2インスタンス2台を作成します。
2.2 Labelを付けます
Key: ohara-lambda Value:start&stop
以下はEC2インスタンスの開始と停止するそれぞれのLambda関数を作成します。作成する際に、Pythonのバージョンと作成されたRoleを選択します。
3.1 StartEC2関数を作成する
3.2. StopEC2関数を作成する
上記作成された関数の中身は空なので、関数を編集して、リージョン情報など必要なパラメータを追加する必要があります。
4.1 StartEC2関数コードを編集する
以下はEC2インスタンスを開始するサンプルコードです。
lambda_function.py
import json
import boto3
def lambda_handler(event, context):
region = "ap-northeast-1"
client = boto3.client('ec2', region)
responce = client.describe_instances(Filters=[{'Name': 'tag:ohara-lambda', "Values": ['start&stop']}])
target_instans_ids = []
for reservation in responce['Reservations']:
for instance in reservation['Instances']:
target_instans_ids.append(instance['InstanceId'])
print(target_instans_ids)
client.start_instances(InstanceIds=target_instans_ids)
print('EC2 instances are started .')
return {
"statusCode": 200,
"message": 'Finished start EC2 instances process.'
}
4.2 StopEC2関数コードを編集する
以下はEC2インスタンスを停止するサンプルコードです。
lambda_function.py
import json
import boto3
def lambda_handler(event, context):
region = "ap-northeast-1"
client = boto3.client('ec2', region)
responce = client.describe_instances(Filters=[{'Name': 'tag:ohara-lambda', "Values": ['start&stop']}])
target_instans_ids = []
for reservation in responce['Reservations']:
for instance in reservation['Instances']:
target_instans_ids.append(instance['InstanceId'])
print(target_instans_ids)
client.stop_instances(InstanceIds=target_instans_ids)
print('EC2 instances are stopped.')
return {
"statusCode": 200,
"message": 'Finished stop EC2 instances process.'
}
まずは上記作成された関数が上手く動作するかを検証するため、関数コードを手動で実行します。
5.1.1 StartEC2関数を実行前、EC2のステータスを確認します
5.1.2 StartEC2関数:デフォルトの設定でEventを設定
5.1.3 StartEC2関数を実行する
5.1.4 StartEC2関数を実行後、EC2のステータスを確認します
5.2.1 StopEC2関数:デフォルトの設定でEventを設定
5.2.2 StopEC2関数を実行する
5.2.3 StopEC2関数を実行後、EC2のステータスを確認します
以降は、EC2インスタンスが自動的に実行できるように、CloudWatch Eventを設定し、上記作成された関数を定期的に実行します。
6.1.1 CloudWatch Eventsを設定します
6.1.2 CloudWatch Eventsルールを設定します
LambdaはUTC協定時間を採用しています。
UTC日本時間とUTC協定時間では+9時間の時差があります。
eg: 25 11 * * ? *
6.1.3 CloudWatch Eventsで関数を実行後、ステータスを確認します
6.2.1 CloudWatch Eventsルールを設定します
eg: 35 11 * * ? *
6.2.2 CloudWatch Eventsで関数を実行後、ステータスを確認します
以降は具体的なシナリオでCloudWatch Eventsの設定例を紹介します。
7.1.1 CloudWatch EventsでStartEC2設定例
•AM 9:00に対象タグ(start&stop)がついているEC2インスタンスが自動起動
•毎週月‐金の朝9時に実行させたい場合、UTC協定時間の0時に設定する
•Cron表記: 0 0 ? * MON-FRI *
※Lambdaは、UTC協定時間を採用しています。 UTC日本時間とUTC協定時間では+9時間の時差があります。
7.1.2 CloudWatch EventsでStopEC2設定例
•毎週月‐金の夜9時に実行させたい場合、UTC協定時間の12時に設定する
•Cron表記: 0 12 ? * MON-FRI *
AWSのLambdaはUTC協定時間を採用しています。日本時間と+9時間の時差があることに注意する必要があります。
また、Lambda関数でPythonスクリプトを書くため、ある程度のPython知識が必要です。
本記事は、AWSのLambdaとPythonを使って、簡単にEC2インスタンスを一定時刻に自動起動&自動停止する方法をご紹介させて頂きました。興味を持っている方はお試し下さい。
条件に該当するページがございません