目的→サーバー代の節約
http://myhero2.s3-website-us-west-2.amazonaws.com
Angularのチュートリアルを参考に作成したポートフォリオです。
バックエンドでSpringBoot(EC2)とKeyCloak(FARGATE)とMySQLが動いています。
特にFARGATEは個人で運用する分にはサーバ代が高い為、
CloudWatchEvents+lambdaで決まった時間にタスクをストップさせる構成を実装します。
lambdaの作成と設定
AWS Lambdaのコンソール画面より関数の作成をクリックします。
1.lambda関数名を設定します。
2.今回はpythonのAWSSDK(boto3)を使用する為、「Python 3.8」を選択します。
3.関数の作成をクリックします。
これで関数は作成できましたが、デフォルトの実行ロールではECSのサービスの設定をアップデートさせることができません。以下の手順を参考にデフォルトのロールに権限を付与します。
FullAccessのポリシーをアタッチしてしまうのはセキリティ上、ベストプラクティスではない場合がありますが、今回は個人のアカウントなのでFullAccessのポリシーをアタッチします。
lambdaのソースコード
def lambda_handler(event, context):
#desiredcountを0にする
client = boto3.client('ecs')
response = client.update_service(
cluster='myk',
service='ecs-kck-myk',
desiredCount=0,
)
#停止するために必要なtaskArnを取得
response = client.list_tasks(
cluster='myk',
launchType='FARGATE'
)
taskArns=response["taskArns"]
#タスクを停止
for task in taskArns:
response = client.stop_task(
cluster='myk',
task=task,
)
desiredCountを0にすることでECSのサービス内のタスクをストップさせた時、自動でタスクが開始されるのを防ぎます。今回は特にサービスなどを指定せずにクラスター内のtaskArnを全て取得して、クラスター内の全てのタスクを停止させています。
CloudWatchEventsでルールを作成する
AWSコンソールよりCloudWatchEventsの画面を開き、ルールの作成をクリックします。
CloudWatchEventsの設定
1.スケジュールをクリック
2.Cron式をクリックしてlambdaを実行したい時間を入力
今回は平日の18:00にlambdaを実行させたい為、
0 3 ? * TUE-SAT *
と入力します。GMTとJSTの9時間の時差を考慮することに注意します。
Cron式についてはこちらに詳しく書いてあります。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
3.ターゲットの選択より実行したいlambda関数を選択します。
4.設定の詳細をクリックします。後はルールの名前を決めてルールを作成します。
CloudWatchEvents側での設定は以上です。
これで、指定された時間にlambda関数が実行されます。
今回は決まった時間にタスクを停止させる構成を実装をしましたが、同様にしてタスクを開始させる構成を実装することで、決まった時間のみにポートフォリオを公開することができ、サーバー代を節約できます!