AWS EC2インスタンスを毎日特定の時間に開始および停止する簡単な方法はありますか?これにより、開発サーバーとテストサーバーの費用を大幅に節約できます。
更新
AWSは、「 インスタンススケジューラ 」と呼ばれるツールをリリースしました。これには、そのページからリンクされている完全な 構成ガイド が含まれます。これは、以下で説明するEC2スケジューラーの拡張であり、いくつかの機能が追加されているように見えますが、基本的には同じです。
以下のガイドは引き続き機能しますが、新規インストールのインスタンススケジューラを確認することをお勧めします。
元の投稿
AWSには EC2スケジューラー というツールがあり、EC2インスタンスの開始と停止を非常に柔軟に制御できます。
このツールを使用すると、ツールのセットアップ時にデフォルトの開始時刻と終了時刻を定義できます。これは後で変更できます。制御するインスタンスを選択でき、タグを使用して、インスタンスごとに異なる開始時間と停止時間を指定できます。
これは素晴らしいツールですが、ドキュメントはやや曖昧で紛らわしいものです。それは、ドキュメントがテクニカルライターではなく、ツールを作成し、それについてすべてを知っているエンジニアによってドキュメントが作成されたようなものです。
注:フィードバックや修正がある場合はコメントをお待ちしています。これに基づいて質問がある場合は、独自の質問を開始してください。
EC2スケジューラとは
このツールは、CloudwatchイベントとDynamoDBで機能するLambda関数です。 Cloudformationテンプレートを使用してデプロイされます。これは、必要なIAMロールとポリシーもセットアップします。あなたはアーキテクチャについて読むことができます ここ 。
導入
このページ に移動して、「ソリューションを起動」をクリックします。現在、直接リンクは here ですが、変更される可能性があります。
コンソールの上部で、リソースをデプロイするリージョンを選択します。スクリプトは任意のリージョンのEC2インスタンスを制御しますが、1つのリージョンで実行されます。
EC2インスタンスのタグ付け
これはドキュメント here でカバーされていますが、それほど単純ではありません。
インスタンスにタグを付けることで、起動および停止するインスタンスを制御します。
最も単純なケースでは、スケジュールに従って開始および停止する各EC2インスタンスにタグを付ける必要があります。これを行うには、コンソールでEC2インスタンスを見つけ、タグをクリックして、このタグを作成します
コピーと貼り付けを有効にするには:
特定のインスタンスを別のスケジュールで開始および停止する場合は、タグのキーと値に追加情報を追加します。たとえば、インスタンスを1500 UTCで開始し、火曜日、木曜日、金曜日の2400 UTCで停止する場合は、次のように入力します。
キー:scheduler:ec2-startstop:late値:1500; 2400; utc; tue、thu、fri
「late」という単語は任意の文字列にでき、「late」には特別な意味はありません。
このツール を使用して、UTCを現地時間に変換できます。
タグエディター を使用して、インスタンスを一括でタグ付けできます。これにより、一括タグ付けをより簡単に設定できるようになります。これは、開発、テスト、本番用にさまざまな設定を行う場合に役立ちます。これをプロダクションで使用することはないでしょう。
CloudFormationパラメータ
CloudFormationテンプレートを実行するときは、多くのパラメーターを入力する必要があります。ほとんどの場合、デフォルトのままにすることができます。ここに最も重要なパラメータのいくつかがあります
権限、ポリシー、および役割
CloudFormationテンプレートの[Permissions]/[IAM role]セクションは、赤いニシンです。つまり、ほとんど関係ありません。 CloudFormationスクリプトの実行に使用されるロールのみを指定します。作成されたリソースやラムダ関数の実行時に使用されるロールに違いはありません。振り返ってみると、これは明白ですが、私が始めたとき、私には明白ではありませんでした。
このスクリプトを同じロールおよびインライン権限として実行すると、IAM内で作成されます。 Lambda関数は、スクリプトが作成する「ec2スケジューラーの役割」を使用して実行されます。
誰かに役立つ場合に備えて、以下のポリシーを記載しました。
CloudWatchイベントとメトリクス
Lambda関数からのログを表示する場合は、Cloudwatchイベントに移動します。ログはかなり良いです。メトリックもあるので、いつ実行されるか、いつ実行されるかなどを確認できます。
追加
ラムダ関数のコードは Github で入手できます。
ポリシー
これらは一般的には必要ありませんが、誰かのためになる可能性があるので、含めます。
IAMロールのポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:DescribeTags",
"iam:CreateRole",
"iam:GetRole",
"iam:PassRole",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:DeleteRole",
"dynamodb:*",
"lambda:*",
"SNS:Publish",
"events:*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "S3:GetObject",
"Resource": [
"arn:aws:s3:::solutions-us-west-2",
"arn:aws:s3:::solutions-us-west-2/*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:StopInstances",
"ec2:StartInstances"
],
"Resource": [
"arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
]
}
]
}
IAMロールの信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"cloudformation.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
インスタンスを開始および停止するだけの場合は、これもLambdaサービスを利用する別の方法です。特定のインスタンスIDを制御することを想定しています。複数のインスタンスを制御するには、カンマで区切ってさらにIDを追加します。 (例: 'i-3453453'、 'i-45656745')。インスタンスのIDは、AWSコンソールの[インスタンス]セクションで確認できます。
以下のコード
{
"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": "*"
}
]
}
以下のコード
import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']
def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name=region)
ec2.stop_instances(InstanceIds=instances)
print 'stopped your instances: ' + str(instances)
以下のコード
import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']
def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name=region)
ec2.start_instances(InstanceIds=instances)
print 'started your instances: ' + str(instances)
ここでは、夜にLambda関数をトリガーするCloudWatchイベントを作成します
注:cron式はUTCで評価されます。希望するタイムゾーンに合わせて式を調整してください。これは、毎日08:00 GMT/UTCに関数を実行する例です。
0 08 * * ? *
朝にインスタンスを再起動するには、これらの手順を繰り返し、希望の開始時間を使用します。関数が失敗するたびにメールメッセージを送信する場合は、SNSトピックを設定し、Lmbda関数作成ウィンドウの[デバッグ]でそのメッセージの送信を設定できます。
このすべてのソースはここにあります: AWSドキュメント