プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

EC2 の自動起動と自動停止

こちらの記事で書いたように、オフラインマップサーバーをEC2上に移しましたが、このサーバーは常時稼働する必要はありません。 EC2は動かしておくと、課金もされるので、必要な時だけ、自動的に起動して、自動的に停止させたいと思います。

ネットを調べると、いろいろな方法で実現できることがわかります。今回は楽をしたかったので、 CloudWatchEvent + AWS System Manager(旧称 SSM) による処理としました。

元ネタは下記になります。

IAM ロールの作成

IAM ロールを作成する際、最初にサービスとして、 System Manager を選択します。

f:id:junichim:20210419103437p:plain f:id:junichim:20210419103521p:plain

そのうえで、ポリシーとして SSMAutomationRole をアタッチします。

f:id:junichim:20210419103608p:plain

ロール名を指定して、ロールを作成します。

f:id:junichim:20210419103737p:plain

IAMロール作成後、信頼関係を表示して、

f:id:junichim:20210419103920p:plain

『信頼関係の編集』を行い、信頼されたエンティティとして、

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ssm.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

とあるのを、

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "events.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

のように変更します。

EC2 起動用の CloudWatchEvent ルールの作成

IAM ロールが作成できれば、次は CloudWatchEvent のルールを作成します。ルールは、 Cron 式で指定します。 『ターゲット』として、『SSM Automation』を選択し、ドキュメントから『AWS-StartEC2Instance』を選択します。

f:id:junichim:20210419104354p:plain

ドキュメントを選択すると、インスタンスID入力欄が出てくるので、対象となる EC2 インスタンスのインスタンスIDを入力します。

f:id:junichim:20210419104700p:plain

最後に、ロールとして、先ほど作ったロールを設定すればOKです。

f:id:junichim:20210419104903p:plain

EC2 停止用の CloudWatchEvent ルールの作成

EC2 停止用の CloudWatchEvent ルールも起動用と同様に作成します。停止用の場合は、ドキュメントして、『AWS-StopEC2Instance』を選択するだけです。

テスト

作成したルールの Cron 式で起動する時間を適当に調整してテストします。指定した時間になると、EC2インスタンスが起動していることが確認できればOKです。停止も同様に確認しておきます。正しく動作していれば、これでOKです。

もし、EC2が期待したように起動しない場合は、ルールそのものが呼び出されたのか、ルールは呼ばれたけどEC2の起動に失敗したか、などは、CloudWatch メトリクスを見ればわかります。

f:id:junichim:20210419105347p:plain

まとめ

SSMを使えば、EC2の起動停止の制御が非常に簡単にできることがわかりました。

これ、いままで動かしっぱなしだった他の EC2 でも応用できますね。うまくすればずいぶんと、お安く運用できそうです。