テスト環境または重要でない AWS Elastic Beanstalk 環境を、スケジュールされた時間に停止して再起動するにはどうすればよいですか?

最終更新日: 2020 年 9 月 28 日

テストまたは重要性の低い AWS Elastic Beanstalk 環境をスケジュール通りに終了して再構築したいと思っています。

簡単な説明

API コール terminate-environment および rebuild-environment を使用して、Elastic Beanstalk 環境を停止および再起動できます。終了した環境は、終了から 6 週間 (42 日) 以内にのみ再構築できます。

これらの呼び出しをスケジュールに従って実行するには、Amazon CloudWatch Events でイベントを設定して、毎日決まった時刻に AWS Lambda 関数をトリガーします。次に、それらの Lambda 関数を設定して Elastic Beanstalk API コールを行います。

重要: Elastic Beanstalk 環境またはそのインスタンスに対して行った帯域外変更は、環境の終了後は保持されません。環境を変更するときは、この要素を考慮してください。また、終了時刻をメモし、その時刻になる前に当該のインスタンスを使用する作業を完了してください。ユーザーがそのインスタンスに接続されていなくても、インスタンスはスケジュールされた時刻に終了します。

解決方法

開始する前に、Elastic Beanstalk 環境の ID (EnvironmentId) を書き留めます。

重要: 以下の解決策で、Elastic Beanstalk 環境およびリソースから、サービスで生成されたタグをすべて削除することができます。

Lambda 関数の IAM ロールを作成する

1.    Lambda 関数の AWS Identity and Access Management (IAM) ロール用のインラインポリシー (例: Lambda.json) を以下の内容で作成します。以下はその例です。

$ cat Lambda.json 
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com"
        ]
      },
      "Action": [
        "sts:AssumeRole"
      ]
    }
  ]
}

2.    ステップ 1 で作成したポリシーを使用して IAM ロールを作成します。以下はその例です。

aws iam create-role --role-name elasticbeanstalk-lambda-role --assume-role-policy-document file://Lambda.json

3.    IAM ロールの Amazon リソースネーム (ARN) をメモします。

4.    次の管理ポリシーを IAM ロールにアタッチします。

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AWSElasticBeanstalkFullAccess --role-name elasticbeanstalk-lambda-role

Lambda 関数デプロイパッケージを作成する

1.    Elastic Beanstalk 環境を再起動するには、次のコードをコピーしてテキストエディタに貼り付けます。

import boto3
envid=['e-awsenvidid']
client = boto3.client('elasticbeanstalk')
def handler(event, context):
    try:
         for appid in range(len(envid)):
             response = client.rebuild_environment(EnvironmentId=str(envid[appid].strip()))
             if response:
                 print('Restore environment %s' %str(envid[appid]))
             else:
                 print('Failed to Restore environment %s' %str(envid[appid]))

    except Exception as e:
        print(e)

重要: e-awsenvidid を Elastic Beanstalk 環境の ID に置き換えてください。

注意: 上記のコードサンプルは、Python 3.6 ランタイムに準拠しています。

2.    このコードを Python ファイルとして保存します (例: StartElasticBeanstalk.py)。

3.    Python ファイルを ZIP ファイルに圧縮します (例: StartElasticBeanstalk.zip)。

4.    Elastic Beanstalk 環境を終了するには、次のコードをコピーしてテキストエディタに貼り付けます。

import boto3
envid=['e-awsenvidid']
client = boto3.client('elasticbeanstalk')
def handler(event, context):
    try:
         for appid in range(len(envid)):
             response = client.terminate_environment(EnvironmentId=str(envid[appid].strip()))
             if response:
                 print('Terminating environment %s' %str(envid[appid]))
             else:
                 print('Failed to Terminate environment %s' %str(envid[appid]))
             
    except Exception as e:
        print(e)

重要: e-awsenvidid を Elastic Beanstalk 環境の ID に置き換えてください。

5.    このコードを Python ファイルとして保存します (例: StopElasticBeanstalk.py)。

6.    Python ファイルを ZIP ファイルに圧縮します (例: StopElasticBeanstalk.zip)。

Lambda 関数を作成する

注意: AWS コマンドラインインターフェイス (AWS CLI) のコマンド実行時にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください

Elastic Beanstalk 環境を停止および再起動する Lambda 関数を作成するには、AWS CLI で次のコマンドを実行します。

aws lambda create-function \
--function-name StartElasticBeanstalk \
--zip-file fileb://file-path/StartElasticBeanstalk.zip \
--role arn:aws:iam::012345678912:role/elasticbeanstalk-lambda-role \
--handler StartElasticBeanstalk.handler \
--runtime python3.6 --region us-west-2

aws lambda create-function \
--function-name StopElasticBeanstalk \
--zip-file fileb://file-path/StopElasticBeanstalk.zip \
--role arn:aws:iam::012345678912:role/elasticbeanstalk-lambda-role \
--handler StopElasticBeanstalk.handler \
--runtime python3.6 --region us-west-2

重要: us-west-2 は、Elastic Beanstalk 環境がある AWS リージョンに置き換えてください。また、コマンドごとにデプロイパッケージ (StartElasticBeanstalk.zip または StopElasticBeanstalk.zip) と IAM ロールの ARN をパラメータとして指定してください。

Lambda 関数をトリガーする CloudWatch Events ルールを作成する

1.    Lambda 関数を開始および停止するには、次のコマンドを実行します。

aws events put-rule --name "StartLambdaFunction" --schedule-expression "cron(0 8 * * ? *)" --region us-west-2
aws events put-rule --name "StopLambdaFunction" --schedule-expression "cron(0 18 * * ? *)" --region us-west-2

注意: --schedule-expression プロパティには、cron 構文が必要です。必要に応じて、--schedule-expression プロパティの値を更新します。us-west-2 は、Elastic Beanstalk 環境がある AWS リージョンに置き換えます。

2.    CloudWatch Events サービスプリンシパル(events.amazonaws.com) を信頼し、ステップ 1 で作成したルールにアクセス許可の範囲を拡張するには、次の add-permission コマンドを実行します。

aws lambda add-permission \
--function-name StartElasticBeanstalk \
--statement-id StartLambdaFunction \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-west-2:012345678912:rule/StartLambdaFunction --region us-west-2

aws lambda add-permission \
--function-name StopElasticBeanstalk \
--statement-id StopLambdaFunction \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-west-2:012345678912:rule/StopLambdaFunction --region us-west-2

注意: us-west-2 は、Elastic Beanstalk 環境がある AWS リージョンに置き換えます。

3.    ルールがスケジュールどおりに実行されるように、このルールに作成した Lambda 関数を追加するには、次の put-targets コマンドを実行します。

aws events put-targets --rule StartLambdaFunction --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:012345678912:function:StartElasticBeanstalk" --region us-west-2

aws events put-targets --rule StopLambdaFunction --targets "Id"="2","Arn"="arn:aws:lambda:us-west-2:012345678912:function:StopElasticBeanstalk" --region us-west-2

重要: 各コマンド内の ARN を IAM ロールの ARN に置き換えてください。us-west-2 は、Elastic Beanstalk 環境がある AWS リージョンに置き換えます。

AWS CloudFormation テンプレートを使用する

この解決策では、これらのすべてのアクションを実行する AWS CloudFormation テンプレートを作成できます。テンプレートを設定して、Lambda IAM 実行ロールを作成したり、Lambda 関数を開始したり、Lambda 関数を停止したり、CloudWatch イベントをトリガーしたりできます。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?