ECS Execでファイルのダウンロードをしたい
こんにちは aka です.
ECS Execを使う際, ファイルのダウンロードができないのでどうにかしたという話です.
ファイルのアップロードはコピペで頑張ればいけるんですけどね…
前提
- ECS クラスタにECS Execの使用を許可している.
- 色々やることあるので公式の記事を参考に設定を行なってください.
- https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html#ecs-exec-enabling-and-using
- ローカルからECS Execを使える.
base64コマンドがリモート, ローカルサーバーともにある.- (Optional) 圧縮系のコマンドがリモート, ローカルにある.
- 今回は
gzipを使いますが,tarコマンドの方が色々便利なのでそっちを使ってもいいと思います.
- 今回は
⚠️ 注意点
- Macのsedを使っているのでGNU sedは使い勝手違うかもしれません.
- 大容量のファイルのダウンロードは負荷がかかるため, その場合はS3にアップロードをすることをおすすめします. ECSのパフォーマンスに影響を与えるため.
結論
CLUSTER=ClusterName
CONTAINER=ContainerName
TASK_ID=TaskId
F=FileName.gz.base64.stdout
aws ecs execute-command --cluster $CLUSTER --task $TASK_ID --container $CONTAINER --interactive --command "bash -c \"gzip $TF -c | base64\"" > $F
L=$(wc -l $F| awk '{print $1}')
awk -v L=$L 'NR==6,NR==L-4 {print $1}' $F | sed -E $'s/\\\r?$//g' | awk '{print}' ORS='' > ${F%".stdout"}
base64 -d -i ${F%".stdout"} -o ${F%".base64.stdout"}
gzip -d ${F%".base64.stdout"}
解説
やっていることは至ってシンプルで, 以下のことをやっています.
-
ファイルを圧縮 +
base64エンコード したものをローカルマシンにリダイレクトしてファイルを作成 -
ECS Exec使用時に出るメッセージを削除(1~5行, 最終行から3行前~最終行)
-
ECS Exec使用時に出るメッセージの例
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ... ${ファイルを圧縮 + `base64`した内容} Exiting session with sessionId: ...
-
-
改行を削除し, 全ての行を1行に連結.
- ECS Exec使用時に, 1行の文字数がある上限に達すると勝手に折り返し(改行)するため
-
base64デコード + ファイルの展開
末尾から3行を取り除くのと, 改行の処理がめんどくさいですがそこさえコマンドができれば簡単でした.
まとめ
今回はECS Execでファイルのダウンロードをする方法を紹介しました.
ECS Exec独特の処理を除けば, やっていることは至ってシンプルです. 一般的なネットワーク通信も似たようなことをしていますし.
余談
ここまで書いておきながらですが…
ECS Execは楽ですが以下の点から使わないことを推奨します.
- [セキュリティ] ECS Execができるという点でセキュリティホールになります.
- [アプリケーション設計 & 運用] ファイル操作はS3やEFSを使うべきです.
- [アプリケーション設計 & 運用] ログやパフォーマンスのモニタリングをしたい場合はECS Execを使わずに外だししましょう. どちらもCloudWatchの機能で達成できます.
- [アプリケーション設計 & 運用] 2, 3以外のユースケースでも, ECS Execが必要なユースケースというのは手動の操作が発生しているということなので, 理想的にはその操作を自動化したいですね.