AWS CloudShell で長時間の処理をするのはなかなか難しいという話

記事タイトルとURLをコピーする

こんにちは
春が近いですね

f:id:swx-yamamoto:20220308185738p:plain
いつかの桜

さて本題です

AWS CloudShell ではどれくらい長時間の処理ができるのか? (仕様の確認)

ドキュメントを見てみましょう
Limits and restrictions for AWS CloudShell - AWS CloudShell

Shell sessions
・Inactive sessions: AWS CloudShell is an interactive shell environment—if you don't interact with it using your keyboard or pointer for approximately 20–30 minutes, your shell session will end. (Running processes do not count as interactions.)
・Long-running sessions: A shell session that's been running continuously for approximately 12 hours will automatically end, even if the user is regularly interacting with it during that period.

要約すると

  • (シェル上で何かプロセスを実行していても)キーボードやマウスを使った操作が 20〜30 分無いとセッションが終了する
  • セッションが終了しないようにキーボードやマウスを使った操作をしていても 12時間後にセッションが終了する

というわけで長時間かかるシェルを実行するのは結構厳しいですね

仕様を確認してみる

試しに 50分 待って テキストを出力するシェル (a.sh) を作りました

#!/bin/bash -
echo a > a.txt
sleep 3000 # 50分
echo b > b.txt

そして実行してみました (訳あって先に"sudo su -" で root ユーザーになってからシェルを作って実行しています)

sh a.sh

実行中

f:id:swx-yamamoto:20220308193844p:plain

もう一つ CloudShell の画面を立ち上げてプロセス状態を確認します ※ CloudShellは同時に10画面まで使えます
すると 一番上の PID 45 を親プロセスにして a.sh が実行されています ( PPID を辿っていくと PID = 45 が最上位の親プロセス)

f:id:swx-yamamoto:20220308193758p:plain

キーボードやマウスを使った操作をしないと 30分程度でシェルセッションが消えました(仕様通り)
f:id:swx-yamamoto:20220308195029p:plain

そして もう一つの CloudShell の画面から見ると a.sh のプロセスは PID 45 の親プロセスごと無くなっていました f:id:swx-yamamoto:20220308195326p:plain

仕様通りですね

というわけで

もう少し抗ってみました

crontab は使えない

cron に入れてしまえばこっちのもの・・・

→ /etc/crontab のディレクトリすらありませんでした(ぴえん😢)

f:id:swx-yamamoto:20220308194441p:plain

シェルをバックグラウンド実行して放置してみる

a.sh を バックグラウンド実行してみました

sh a.sh &

実行中
f:id:swx-yamamoto:20220308200802p:plain

もう一つ CloudShell の画面を立ち上げてプロセス状態を確認します
すると 一番上の PID 4175 を親プロセスにして a.sh が実行されています ( PPID を辿っていくと PID = 4175 が最上位の親プロセス)
f:id:swx-yamamoto:20220308200851p:plain

キーボードやマウスを使った操作をしないと 30分程度でシェルセッションが消えました(仕様通り)
f:id:swx-yamamoto:20220308203314p:plain

そして もう一つの CloudShell の画面から見ると a.sh のプロセスは PID 4175 の親プロセスごと無くなっていました f:id:swx-yamamoto:20220308203250p:plain

→仕様には逆らえないようです(ぴえん😢)

シェルをnohupでバックグラウンド実行して放置する

a.sh を nohupでバックグラウンド実行してみました ※ nohup コマンドは HUPシグナルを無視するためのコマンド

nohup sh a.sh &

→結果は バックグラウンド実行と同じでした
20〜30分でセッションが終了するときには他のシグナルが送られているのでしょう

→敗北ですね(ぴえん😢)

仕様には逆らえない
ということが分かりました

他の気づき↓

CloudShell のホストが変わる

CloudShellの起動時に Waiting for the environment to run ... と出るときは ホストが変わるようです
数時間触ってないと起きます

f:id:swx-yamamoto:20220308202901p:plain
Waiting for the environment to run ...

ホストのIPアドレスが変わっていて

→ root ユーザーのホームディレクトリに置いたシェルが無くなっていました (ぴえん😢)

f:id:swx-yamamoto:20220308203042p:plain

※ ll を lll とタイポしてるのは見逃してください...

CloudShell のストレージを利用するなら cloudshell-user のホームディレクトリを使いましょう (2022/03/09 追記)

の制限と規制AWS CloudShell - AWS CloudShell

With AWS CloudShell, you have persistent storage of 1 GB for each AWS Region at no cost. Persistent storage is located in your home directory ($HOME) and is private to you. Unlike ephemeral environment resources that are recycled after each shell session ends, data in your home directory persists between sessions. If you stop using AWS CloudShell in an AWS Region, data is retained in the persistent storage of that Region for 120 days after the end of your last session. After 120 days unless you take action, your data will be automatically deleted from the persistent storage of that Region. You can prevent removal by simply launching AWS CloudShell again in that AWS Region.

AWS CloudShellを使用すると、AWSリージョンごとに1GBの永続ストレージを無料で利用できます。永続ストレージはホームディレクトリ($ HOME)にあり、プライベートです。各シェルセッションが終了した後にリサイクルされるエフェメラル環境リソースとは異なり、ホームディレクトリ内のデータはセッション間で保持されます。 AWSリージョンでのAWSCloudShellの使用を停止した場合、データは最後のセッションの終了後120日間、そのリージョンの永続ストレージに保持されます。 120日後、アクションを実行しない限り、データはそのリージョンの永続ストレージから自動的に削除されます。そのAWSリージョンでAWSCloudShellを再度起動するだけで、削除を防ぐことができます。

cloudshell-user のホームディレクトリに 120 日間は保存されるということですね
はじめに ログインしたときは cloudshell-user になっています
つい root ユーザーになってしまう人は要注意です(ここにいます)
f:id:swx-yamamoto:20220309123716p:plain

まとめ↓

CloudShellで長時間の処理をするのはなかなか難しい

  • (シェル上で何かプロセスを実行していても)キーボードやマウスを使った操作が 20〜30 分無いとセッションが終了する
  • セッションが終了しないようにキーボードやマウスを使った操作をしていても 12時間後にセッションが終了する

加えて

  • 数時間経つとホストが変わるので シェル等の資材を root のホームディレクトリに配置して置くと消える (ぴえん😢)
    • cloudshell-user のホームディレクトリに置いておくと残ります (2022/03/09 追記)

→シェルなどの資材はcloudshell-user のホームディレクトリや別の場所で保管してインタラクティブな環境として使用しましょう

(どうしても長時間の処理するならEC2やECSを使いましょう)

おわり

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、登山(たまに)