こんにちは、趙です。
今日はLambdaを使て、リージョン内特定タグのEC2の自動起停操作を紹介します。

次の順に従って説明します

1.IAMロール作成
2.Lambdaコード作成
3.トリガー追加、cloudwatch events設定

1.IAMロールを作成します

まず、ポリシー[StartStopEC2-Policy]を作成し、
下記の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*",
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        }
    ]
}

説明:

許可されるアクション:

logs:CreateLogGroup新しいロググループを作成します。
logs:CreateLogStreamは、ロググループに新しいログストリームを作成します
logs:PutLogEventsは、ログイベントのバッチをログストリームにアップロードします

ec2:開始インスタンスを開始
ec2:停止
インスタンスの停止
ec2:DescribeInstances

ロール[StartStopEC2-Role]を作成し、上記のポリシー[StartStopEC2-Policy]を添付します。

2.Lambdaコードを作成します

1.関数を作成します

 関数名:Start_EC2_Instances
 ランタイム:Python 3.7
 アクセス権限:既存のロール[StartStopEC2-Role]を選択します

2. 次のコードをコピーします

import boto3

def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name='eu-west-1')

with_tag = ec2.describe_instances(Filters=[{ 'Name': 'tag:Cost', 'Values': ['Cost1'] }])
tag_list = list(ec2['InstanceId'] for resId in with_tag['Reservations'] for ec2 in resId['Instances'])

ec2.start_instances(InstanceIds=tag_list)
response = {"StartInstances": tag_list}

return response

3. エリア内のEC2の数が多い場合、タイムアウトを3分以上に設定してください。

テストイベントを作成して、作成されたコードが問題あるかどうか確認します。

3.トリガーを追加してから、CloudWatch Eventsを設定

1.CloudWatchイベントを選択します

2.新規ルールを作成し、名前を入力します

3.ルールタイプでスケジュール式(Cron)を使用して、作成します。

例:cron(0 0? MON-FRI
UTC時間を使用して、毎週月から金の午前9時に実行します。

このように、アイルランドリージョン、
毎週月から金の午前9時に、Cost = Cost1、すべてのEC2が自動的に起動します。

同様に、毎晩自動的に停止するLambdaを作成できます。
修正必要のコードは下記のみです。

ec2.start_instances(InstanceIds=tag_list)

修正後↓

ec2.stop_instances(InstanceIds=tag_list)

以上です。

Last modified: 2020-02-08

Comments

Write a Reply or Comment

Your email address will not be published.