Lambdaを使ったEC2インスタンスの自動起動停止

このブログはAWSのEC2インスタンスにワードプレスを導入して実現してますが、利用料金を抑えるために、EC2の自動起動停止を設定しました。

参考AWS + WordPressでブログはじめました。

AWSのこの記事の通りに設定すれば、OKですが、AWSに不慣れな人には難しかと思うので、自分の備忘を兼ねて手順を記録することにしました。手順は大きく以下の通りです。

  1. IAMポリシーの作成
  2. IAMロールの作成
  3. 関数の作成(EC2停止用)
  4. CloudWatchイベントの作成(EC2停止用)
  5. 関数の作成(EC2起動用)
  6. CloudWatchイベントの作成(EC2起動用)

※このLambdaは簡易的なLambdaになるので、「複数のインスタンスを別々の時刻に起動・停止したい」というようなことには不向きです。

1. IAMポリシーの作成

1. AWSコンソールから [IAM] をクリック。
2. [ポリシー] – [ポリシーの作成]をクリック。
3. 以下のコードを[JSON] タブに貼り付けて、[ポリシーの確認] をクリック。

{
   "Version": "2012-10-17",
   "Statement": [
     {
       "Effect": "Allow",
       "Action": [
         "logs:CreateLogGroup",
         "logs:CreateLogStream",
         "logs:PutLogEvents"
       ],
       "Resource": "arn:aws:logs:*:*:*"
     },
     {
       "Effect": "Allow",
       "Action": [
         "ec2:Start*",
         "ec2:Stop*"
       ],
       "Resource": "*"
     }
   ]
}

4. 適当に名前をつけて、[ポリシーの作成]をクリック。ポリシー名は「EC2StartStopPolicy」にしました。

2. IAMロールの作成

1. AWSコンソールから [IAM] をクリック。
2. [ロール] – [ロールの作成]をクリック。
3. 以下を選択して、[次のステップ:アクセス権限]をクリック。
・信頼されたエンティティ:AWSサービス
・ユースケース:Lambda

4. [アクセス権限ポリシー]で 前の手順で作成した「EC2StartStopPolicy」を選択し、[次のステップ:タグ]をクリック。

5.[タグの追加(オプション)]は何も設定せずに[次のステップ:確認]をクリック
6. 適当に名前をつけて、[ロールの作成]をクリック。ロール名は「EC2StartStopRole」にしました。

3. 関数の作成(EC2停止用)

1. AWSコンソールから [Lambda] をクリック。
2. [関数の作成]をクリック。
3. 以下のとおり設定し、[関数の作成] をクリック。
・オプション:ーから作成
・関数名:StopEC2Instances ※任意の名前でOK
・ランタイム:Python 3.8 ※Python 3.x であればOK(たぶん)
・アクセス権限:既存のロール – 前の手順で作成したロール ※ EC2StartStopRoleにしてます

4. 関数コードのところに以下のコードを上書き。
青色マーカーの箇所はEC2インスタンスを配置しているリージョンに変更
黄色マーカーのところには停止・対象のインスタンスのIDを指定(複数指定はカンマ区切り)

import boto3
region = 'ap-northeast-1'
instances = ['i-xxxxxxxxxxxxxx', 'i-yyyyyyyyyyyyyyy']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
     ec2.stop_instances(InstanceIds=instances)
     print('stopped your instances: ' + str(instances)) 

<参考>

5. [基本設定]のタイムアウトを10秒に変更

6.画面の最上部の[保存]をクリックして、設定を保存。

4. CloudWatchイベントの作成(EC2停止用)

1. AWSコンソールから[CloudWatch]をクリック
2. [イベント]-[ルール]から[ルールの作成]をクリック
3.以下を設定後、[設定の詳細]wpクリック
・イベントソース:スケジュール / Cron式
・Cron式:任意の設定(僕の場合は、毎日 23時55分に停止させたいので、「55 14 ? * MON-SUN *」を指定
・ターゲット:前の手順で作ったLambda関数名 ※この記事の手順に従っていれば「StopEC2Instances」

4. 適当に名前をつけて「ルールの作成」をクリックします。ここでは「StopEC2Instances」にしました。

これで自動停止の設定は完了です。指定した時間にEC2が停止することを確認できればOKです。

5. 関数の作成(EC2起動用)

1. AWSコンソールから [Lambda] をクリック。
2. [関数の作成]をクリック。
3. 以下のとおり設定し、[関数の作成] をクリック。
・オプション:ーから作成
・関数名:StartEC2Instances ※任意の名前でOK
・ランタイム:Python 3.8
・アクセス権限:既存のロール – 「2.IAMロールの作成」で作成したロール ※ EC2StartStopRoleにしてます

4. 関数コードのところに以下のコードを上書き。
※青色マーカーの箇所はEC2インスタンスを配置しているリージョンに変更
※黄色マーカーのところには停止・対象のインスタンスのIDを指定(複数指定はカンマ区切り)

import boto3
region = 'ap-northeast-1'
instances = ['i-xxxxxxxxxxxxxx', 'i-yyyyyyyyyyyyyyy']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
     ec2.start_instances(InstanceIds=instances)
     print('stopped your instances: ' + str(instances)) 

5. [基本設定]のタイムアウトを10秒に変更

6.画面の最上部の[保存]をクリックして、設定を保存。

6. CloudWatchイベントの作成(EC2起動用)

1. AWSコンソールから[CloudWatch]をクリック
2. [イベント]-[ルール]から[ルールの作成]をクリック
3.以下を設定後、[設定の詳細]wpクリック
・イベントソース:スケジュール / Cron式
・Cron式:任意の設定(僕の場合は、毎日 7時00分に開始させたいので、「00 22 ? * MON-SUN *」を指定
・ターゲット:前の手順で作ったLambda関数名 ※この記事の手順に従っていれば「StartEC2Instances」

4. 適当に名前をつけて「ルールの作成」をクリックします。ここでは「StartEC2Instances」にしました。

これで自動停止の設定は完了です。指定した時間にEC2が起動することを確認できればOKです。

コメント

タイトルとURLをコピーしました