この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
こんにちは、趙です。
今日は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)
以上です。