この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS CloudShellで試したら次は
こんにちは、OS破壊おじさんの のんピ(@non____97)です。
皆さんはOSを破壊したことはありますか? 以下記事の通り、私はあります。
AWS CloudShellで試したのであれば、次はAWS Lambdaですよね? ということで、AWS Lambdaで「rm -rf /*
」を実行してみます。
いきなりまとめ
- Lambda関数でも
rm -rf /*
は実行できる - ただし、Lambda関数から実行できるコマンドに
sudo
やsu
コマンドがないため、rootユーザーでrm -rf /*
は実行できない - 以下の構成でも15分以内に
rm -rf /*
は完了しなかった- ランタイム : Node.js 14.x
- アーキテクチャー : arm64
- メモリ : 10124 MB
- タイムアウト値 : 15分
何故試そうと思ったのか
そこにコマンド実行できる環境があるからです。
「Lambda関数で『rm -rf /*』とか何言っているんだ?」と思う方もいらっしゃるかもしれません。まず、以下記事で紹介している通り、Lambda関数はFirecracker上のmicroVMで実行されます。加えてNode.jsやPythonなどはOSコマンドが実行できます。よって、Lambda関数でもrm -rf /*
は実行できると考えました。
お別れの下準備
試しに以下のようなコードのLambda関数を作成しました。(ランタイムはNode.js 14.xで、アーキテクチャーはarm64です)
const { execSync } = require("child_process")
exports.handler = async (event) => {
console.log(`pwd : ${execSync("pwd").toString()}`)
console.log(`cat /etc/system-release : ${execSync("cat /etc/system-release").toString()}`)
console.log(`cat /etc/os-release : ${execSync("cat /etc/os-release").toString()}`)
console.log(`whoami : ${execSync("whoami").toString()}`)
console.log(`dh -h : ${execSync("df -h").toString()}`)
console.log(`ls -la / : ${execSync("ls -la /").toString()}`)
console.log(`ls -la /usr/bin : ${execSync("ls -la /usr/bin").toString()}`)
};
OSコマンドを実行するためのChild process はNode.jsの標準モジュールなので、別途Child processをインストールしたLambda Layersを作ったり、Lambda関数のコードとnode_modulesをzipで固めてアップロードする必要はありません。
こちらのLambda関数を実行した際のログは以下の通りです。Lambda関数がAmazon Linux 2上で動作していることが分かります。
2021-12-20T10:39:41.759Z 495ea48e-2989-4491-b80d-6b7193dd1e3a INFO pwd : /var/task
2021-12-20T10:39:41.820Z 495ea48e-2989-4491-b80d-6b7193dd1e3a INFO cat /etc/system-release : Amazon Linux release 2 (Karoo)
2021-12-20T10:39:41.860Z 495ea48e-2989-4491-b80d-6b7193dd1e3a INFO cat /etc/os-release : NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
VARIANT_ID="202112090959-2.0.673.0"
VARIANT_ID="202112091006-al2.694.0"
2021-12-20T10:39:41.920Z 495ea48e-2989-4491-b80d-6b7193dd1e3a INFO whoami : sbx_user1051
2021-12-20T10:39:41.980Z 495ea48e-2989-4491-b80d-6b7193dd1e3a INFO dh -h : Filesystem Size Used Avail Use% Mounted on
/mnt/root-rw/opt/amazon/asc/worker/tasks/rtfs/nodejs14.x-amzn-2 9.8G 3.8G 6.0G 40% /
/dev/vdb 1.5G 14M 1.4G 1% /dev
/dev/vdd 526M 872K 514M 1% /tmp
/dev/root 9.8G 3.8G 6.0G 40% /etc/passwd
/dev/vdc 128K 128K 0 100% /var/task
2021-12-20T10:39:42.079Z 495ea48e-2989-4491-b80d-6b7193dd1e3a INFO ls -la / : total 56
drwxr-xr-x 1 12569 users 4096 Dec 12 15:35 .
drwxr-xr-x 1 12569 users 4096 Dec 12 15:35 ..
lrwxrwxrwx 1 root root 7 Dec 9 10:01 bin -> usr/bin
dr-xr-xr-x 2 root root 4096 Apr 9 2019 boot
drwxr-xr-x 2 root root 4096 Dec 20 12:22 dev
drwxr-xr-x 29 root root 4096 Dec 9 10:01 etc
drwxr-xr-x 2 root root 4096 Apr 9 2019 home
lrwxrwxrwx 1 root root 7 Dec 9 10:01 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Dec 9 10:01 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 9 2019 media
drwxr-xr-x 2 root root 4096 Apr 9 2019 mnt
drwxr-xr-x 2 root root 4096 Apr 9 2019 opt
dr-xr-xr-x 70 root root 0 Dec 20 13:10 proc
dr-xr-x--- 2 root root 4096 Apr 9 2019 root
drwxr-xr-x 2 root root 4096 Dec 16 17:14 run
lrwxrwxrwx 1 root root 8 Dec 9 10:01 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 9 2019 srv
dr-xr-xr-x 2 root root 4096 Apr 9 2019 sys
drwx------ 2 sbx_user1051 990 4096 Dec 20 13:10 tmp
drwxr-xr-x 13 root root 4096 Dec 9 10:01 usr
drwxr-xr-x 1 12569 users 4096 Dec 12 15:35 var
2021-12-20T10:39:42.122Z 495ea48e-2989-4491-b80d-6b7193dd1e3a INFO ls -la /usr/bin : total 13492
dr-xr-xr-x 2 root root 4096 Dec 9 10:01 .
drwxr-xr-x 13 root root 4096 Dec 9 10:01 ..
-rwxr-xr-x 1 root root 70024 Jan 23 2020 [
-rwxr-xr-x 1 root root 29 Jul 15 2020 alias
-rwxr-xr-x 1 root root 69832 Jan 23 2020 arch
lrwxrwxrwx 1 root root 4 Dec 9 10:01 awk -> gawk
-rwxr-xr-x 1 root root 70008 Jan 23 2020 base64
-rwxr-xr-x 1 root root 69864 Jan 23 2020 basename
-rwxr-xr-x 1 root root 1037712 Jul 15 2020 bash
lrwxrwxrwx 1 root root 10 Dec 9 10:01 bashbug -> bashbug-64
-rwxr-xr-x 1 root root 6960 Jul 15 2020 bashbug-64
-rwxr-xr-x 1 root root 26 Jul 15 2020 bg
-rwxr-xr-x 1 root root 1638 Sep 30 20:24 ca-legacy
lrwxrwxrwx 1 root root 3 Dec 9 10:01 captoinfo -> tic
-rwxr-xr-x 1 root root 70360 Jan 23 2020 cat
-rwxr-xr-x 1 root root 3283 Sep 28 16:13 catchsegv
-rwxr-xr-x 1 root root 26 Jul 15 2020 cd
-rwxr-xr-x 1 root root 71016 Jan 23 2020 chcon
-rwxr-xr-x 1 root root 70848 Jan 23 2020 chgrp
-rwxr-xr-x 1 root root 70744 Jan 23 2020 chmod
-rwxr-xr-x 1 root root 70904 Jan 23 2020 chown
-rwxr-xr-x 1 root root 69904 Jan 23 2020 cksum
-rwxr-xr-x 1 root root 68736 Sep 19 2019 clear
-rwxr-xr-x 1 root root 70064 Jan 23 2020 comm
-rwxr-xr-x 1 root root 31 Jul 15 2020 command
-rwxr-xr-x 1 root root 204224 Jan 23 2020 cp
-rwxr-xr-x 1 root root 70336 Jan 23 2020 csplit
-rwxr-xr-x 1 root root 70128 Jan 23 2020 cut
-rwxr-xr-x 1 root root 70264 Jan 23 2020 date
-rwxr-xr-x 1 root root 136368 Jan 23 2020 dd
-rwxr-xr-x 1 root root 137808 Jan 23 2020 df
-rwxr-xr-x 1 root root 538520 Jul 31 2018 dgawk
-rwxr-xr-x 1 root root 138136 Jan 23 2020 dir
-rwxr-xr-x 1 root root 69944 Jan 23 2020 dircolors
-rwxr-xr-x 1 root root 69840 Jan 23 2020 dirname
-rwxr-xr-x 1 root root 137600 Jan 23 2020 du
-rwxr-xr-x 1 root root 69808 Jan 23 2020 echo
-rwxr-xr-x 1 root root 290 Jul 31 2018 egrep
-rwxr-xr-x 1 root root 69808 Jan 23 2020 env
-rwxr-xr-x 1 root root 69992 Jan 23 2020 expand
-rwxr-xr-x 1 root root 70048 Jan 23 2020 expr
-rwxr-xr-x 1 root root 136376 Jan 23 2020 factor
-rwxr-xr-x 1 root root 69776 Jan 23 2020 false
-rwxr-xr-x 1 root root 26 Jul 15 2020 fc
-rwxr-xr-x 1 root root 26 Jul 15 2020 fg
-rwxr-xr-x 1 root root 290 Jul 31 2018 fgrep
-rwxr-xr-x 1 root root 70016 Jan 23 2020 fmt
-rwxr-xr-x 1 root root 69968 Jan 23 2020 fold
-rwxr-xr-x 1 root root 469408 Jul 31 2018 gawk
-rwxr-xr-x 1 root root 74632 Sep 28 16:18 gencat
-rwxr-xr-x 1 root root 72320 Sep 28 16:18 getconf
-rwxr-xr-x 1 root root 78376 Sep 28 16:18 getent
-rwxr-xr-x 1 root root 31 Jul 15 2020 getopts
-rwxr-xr-x 1 root root 204064 Jul 31 2018 grep
-rwxr-xr-x 1 root root 69936 Jan 23 2020 groups
-rwxr-xr-x 1 root root 70008 Jan 23 2020 head
-rwxr-xr-x 1 root root 69816 Jan 23 2020 hostid
-rwxr-xr-x 1 root root 80080 Sep 28 16:18 iconv
-rwxr-xr-x 1 root root 70048 Jan 23 2020 id
-rwxr-xr-x 1 root root 3188 Jul 31 2018 igawk
-rwxr-xr-x 1 root root 279576 Jul 27 2018 info
-rwxr-xr-x 1 root root 69576 Sep 19 2019 infocmp
-rwxr-xr-x 1 root root 71080 Jul 27 2018 infokey
lrwxrwxrwx 1 root root 3 Dec 9 10:01 infotocap -> tic
-rwxr-xr-x 1 root root 204224 Jan 23 2020 install
-rwxr-xr-x 1 root root 28 Jul 15 2020 jobs
-rwxr-xr-x 1 root root 70280 Jan 23 2020 join
-rwxr-xr-x 1 root root 5342 Sep 28 16:13 ldd
-rwxr-xr-x 1 root root 69824 Jan 23 2020 link
-rwxr-xr-x 1 root root 70744 Jan 23 2020 ln
-rwxr-xr-x 1 root root 85048 Sep 28 16:18 locale
-rwxr-xr-x 1 root root 361208 Sep 28 16:18 localedef
-rwxr-xr-x 1 root root 69832 Jan 23 2020 logname
-rwxr-xr-x 1 root root 138136 Jan 23 2020 ls
-rwxr-xr-x 1 root root 75808 Sep 28 16:18 makedb
-rwxr-xr-x 1 root root 70080 Jan 23 2020 md5sum
-rwxr-xr-x 1 root root 136984 Jan 23 2020 mkdir
-rwxr-xr-x 1 root root 71144 Jan 23 2020 mkfifo
-rwxr-xr-x 1 root root 71176 Jan 23 2020 mknod
-rwxr-xr-x 1 root root 70184 Jan 23 2020 mktemp
-rwxr-xr-x 1 root root 138392 Jan 23 2020 mv
-rwxr-xr-x 1 root root 69856 Jan 23 2020 nice
-rwxr-xr-x 1 root root 70112 Jan 23 2020 nl
-rwxr-xr-x 1 root root 69944 Jan 23 2020 nohup
-rwxr-xr-x 1 root root 69888 Jan 23 2020 nproc
-rwxr-xr-x 1 root root 135992 Jan 23 2020 numfmt
-rwxr-xr-x 1 root root 70416 Jan 23 2020 od
-rwxr-xr-x 1 root root 69760 Dec 18 2020 p11-kit
-rwxr-xr-x 1 root root 69872 Jan 23 2020 paste
-rwxr-xr-x 1 root root 69832 Jan 23 2020 pathchk
-rwxr-xr-x 1 root root 469416 Jul 31 2018 pgawk
-rwxr-xr-x 1 root root 70112 Jan 23 2020 pinky
-rwxr-xr-x 1 root root 74032 Sep 28 16:18 pldd
-rwxr-xr-x 1 root root 70648 Jan 23 2020 pr
-rwxr-xr-x 1 root root 69808 Jan 23 2020 printenv
-rwxr-xr-x 1 root root 70144 Jan 23 2020 printf
-rwxr-xr-x 1 root root 70640 Jan 23 2020 ptx
-rwxr-xr-x 1 root root 69960 Jan 23 2020 pwd
-rwxr-xr-x 1 root root 28 Jul 15 2020 read
-rwxr-xr-x 1 root root 70360 Jan 23 2020 readlink
-rwxr-xr-x 1 root root 70776 Jan 23 2020 realpath
lrwxrwxrwx 1 root root 4 Dec 9 10:01 reset -> tset
-rwxr-xr-x 1 root root 70944 Jan 23 2020 rm
-rwxr-xr-x 1 root root 69968 Jan 23 2020 rmdir
-rwxr-xr-x 1 root root 146496 Sep 28 16:18 rpcgen
-rwxr-xr-x 1 root root 69984 Jan 23 2020 runcon
-rwxr-xr-x 1 root root 137472 Aug 1 2018 sed
-rwxr-xr-x 1 root root 70136 Jan 23 2020 seq
lrwxrwxrwx 1 root root 4 Dec 9 10:01 sh -> bash
-rwxr-xr-x 1 root root 70096 Jan 23 2020 sha1sum
-rwxr-xr-x 1 root root 70168 Jan 23 2020 sha224sum
-rwxr-xr-x 1 root root 70168 Jan 23 2020 sha256sum
-rwxr-xr-x 1 root root 70168 Jan 23 2020 sha384sum
-rwxr-xr-x 1 root root 70168 Jan 23 2020 sha512sum
-rwxr-xr-x 1 root root 70632 Jan 23 2020 shred
-rwxr-xr-x 1 root root 70672 Jan 23 2020 shuf
-rwxr-xr-x 1 root root 69888 Jan 23 2020 sleep
-rwxr-xr-x 1 root root 138088 Jan 23 2020 sort
-rwxr-xr-x 1 root root 4281 Sep 28 16:13 sotruss
-rwxr-xr-x 1 root root 71040 Jan 23 2020 split
-rwxr-xr-x 1 root root 75176 Sep 28 16:18 sprof
-rwxr-xr-x 1 root root 136256 Jan 23 2020 stat
-rwxr-xr-x 1 root root 70424 Jan 23 2020 stdbuf
-rwxr-xr-x 1 root root 70136 Jan 23 2020 stty
-rwxr-xr-x 1 root root 70224 Jan 23 2020 sum
-rwxr-xr-x 1 root root 69824 Jan 23 2020 sync
-rwxr-xr-x 1 root root 68912 Sep 19 2019 tabs
-rwxr-xr-x 1 root root 69984 Jan 23 2020 tac
-rwxr-xr-x 1 root root 70744 Jan 23 2020 tail
-rwxr-xr-x 1 root root 69912 Jan 23 2020 tee
-rwxr-xr-x 1 root root 69944 Jan 23 2020 test
-rwxr-xr-x 1 root root 135560 Sep 19 2019 tic
-rwxr-xr-x 1 root root 70904 Jan 23 2020 timeout
-rwxr-xr-x 1 root root 68968 Sep 19 2019 toe
-rwxr-xr-x 1 root root 70552 Jan 23 2020 touch
-rwxr-xr-x 1 root root 69248 Sep 19 2019 tput
-rwxr-xr-x 1 root root 70152 Jan 23 2020 tr
-rwxr-xr-x 1 root root 69776 Jan 23 2020 true
-rwxr-xr-x 1 root root 70240 Jan 23 2020 truncate
-rwxr-xr-x 1 root root 203768 Dec 18 2020 trust
-rwxr-xr-x 1 root root 69272 Sep 19 2019 tset
-rwxr-xr-x 1 root root 70000 Jan 23 2020 tsort
-rwxr-xr-x 1 root root 69808 Jan 23 2020 tty
-rwxr-xr-x 1 root root 15370 Sep 28 16:12 tzselect
-rwxr-xr-x 1 root root 29 Jul 15 2020 umask
-rwxr-xr-x 1 root root 31 Jul 15 2020 unalias
-rwxr-xr-x 1 root root 69832 Jan 23 2020 uname
-rwxr-xr-x 1 root root 69976 Jan 23 2020 unexpand
-rwxr-xr-x 1 root root 70264 Jan 23 2020 uniq
-rwxr-xr-x 1 root root 69824 Jan 23 2020 unlink
-rwxr-xr-x 1 root root 1054 Sep 30 20:24 update-ca-trust
-rwxr-xr-x 1 root root 69928 Jan 23 2020 users
-rwxr-xr-x 1 root root 138136 Jan 23 2020 vdir
-rwxr-xr-x 1 root root 28 Jul 15 2020 wait
-rwxr-xr-x 1 root root 70192 Jan 23 2020 wc
-rwxr-xr-x 1 root root 70208 Jan 23 2020 who
-rwxr-xr-x 1 root root 69832 Jan 23 2020 whoami
-rwxr-xr-x 1 root root 69832 Jan 23 2020 yes
注意すべき点ですが、ls -la /usr/bin
の結果の通り、sudo
やsu
は存在しませんでした。そのため、root権限でrm -rf /*
を実行することはできません。残念。
rm -rf /* を実行してみた
それでは、以下のようにrm -rf /*
を実行するLambda関数を用意します。
const { execSync } = require("child_process")
exports.handler = async (event) => {
console.log(`cd /; pwd : ${execSync("cd /; pwd").toString()}`)
console.log(`dh -h : ${execSync("df -h").toString()}`)
console.log(`ls -la / : ${execSync("ls -l /").toString()}`)
console.log(`rm -rf /* : ${execSync("rm -rf /*").toString()}`)
console.log(`ls -la / : ${execSync("ls -la /").toString()}`)
console.log(`dh -h : ${execSync("df -h").toString()}`)
};
実行すると、以下のようにタイムアウトとなってしまいました。
{
"errorMessage": "2021-12-20T10:53:03.387Z 1c0af7af-8927-494d-8344-8404ad3c4c86 Task timed out after 3.00 seconds"
}
タイムアウト値を延ばして rm -rf /* を実行してみた
流石にデフォルトのタイムアウト値の3秒では短すぎたので、タイムアウト値をAWS Lambdaの上限タイムアウト値である15分に変更します。
タイムアウト値を15分に変更した後、再度実行してみると、次はバッファーが足りないというメッセージが出力されて終了しました。
{
"errorType": "Error",
"errorMessage": "spawnSync /bin/sh ENOBUFS",
"trace": [
"Error: spawnSync /bin/sh ENOBUFS",
" at Object.spawnSync (internal/child_process.js:1077:20)",
" at spawnSync (child_process.js:776:24)",
" at execSync (child_process.js:858:15)",
" at Runtime.exports.handler (/var/task/index.js:8:32)",
" at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
]
}
なお、実行時のCloudWatch Logsを確認すると以下のようにcannot remove
と出力しながら頑張っていました。rootユーザーで実行していないのでしょうがないですね。
2021-12-20T10:57:15.320Z 5cbd1edc-1114-426f-8c33-c677a4d622d6 INFO cd /; pwd : /
2021-12-20T10:57:15.400Z 5cbd1edc-1114-426f-8c33-c677a4d622d6 INFO dh -h : Filesystem Size Used Avail Use% Mounted on
/mnt/root-rw/opt/amazon/asc/worker/tasks/rtfs/nodejs14.x-amzn-2 9.8G 3.8G 6.0G 40% /
/dev/vdb 1.5G 14M 1.4G 1% /dev
/dev/vdd 526M 872K 514M 1% /tmp
/dev/root 9.8G 3.8G 6.0G 40% /etc/passwd
/dev/vdc 128K 128K 0 100% /var/task
2021-12-20T10:57:15.480Z 5cbd1edc-1114-426f-8c33-c677a4d622d6 INFO ls -la / : total 56
lrwxrwxrwx 1 root root 7 Dec 9 10:01 bin -> usr/bin
dr-xr-xr-x 2 root root 4096 Apr 9 2019 boot
drwxr-xr-x 2 root root 4096 Dec 20 09:29 dev
drwxr-xr-x 29 root root 4096 Dec 9 10:01 etc
drwxr-xr-x 2 root root 4096 Apr 9 2019 home
lrwxrwxrwx 1 root root 7 Dec 9 10:01 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Dec 9 10:01 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 9 2019 media
drwxr-xr-x 2 root root 4096 Apr 9 2019 mnt
drwxr-xr-x 2 root root 4096 Apr 9 2019 opt
dr-xr-xr-x 70 root root 0 Dec 20 10:57 proc
dr-xr-x--- 2 root root 4096 Apr 9 2019 root
drwxr-xr-x 2 root root 4096 Dec 12 21:36 run
lrwxrwxrwx 1 root root 8 Dec 9 10:01 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 9 2019 srv
dr-xr-xr-x 2 root root 4096 Apr 9 2019 sys
drwx------ 2 sbx_user1051 990 4096 Dec 20 10:57 tmp
drwxr-xr-x 13 root root 4096 Dec 9 10:01 usr
drwxr-xr-x 1 12569 users 4096 Dec 12 15:35 var
rm: cannot remove ‘/bin’: Read-only file system
rm: cannot remove ‘/boot’: Read-only file system
rm: cannot remove ‘/dev/full’: Permission denied
rm: cannot remove ‘/dev/random’: Permission denied
rm: cannot remove ‘/dev/stdin’: Permission denied
rm: cannot remove ‘/dev/zero’: Permission denied
rm: cannot remove ‘/dev/stderr’: Permission denied
rm: cannot remove ‘/dev/urandom’: Permission denied
rm: cannot remove ‘/dev/null’: Permission denied
rm: cannot remove ‘/dev/stdout’: Permission denied
.
.
.
メモリを増やして rm -rf /* を実行してみた
OSコマンドを実行するchild_process.execSyncのリファレンスを確認したところ、maxBuffer
というバッファーのオプションがありました。デフォルトでは1024 * 1024 = 1 MByte
のようです。流石に1 MByteでは足りないと思ったので、1024 * 1024 * 512 = 512 MByte
をバッファーに割り当てます。
const { execSync } = require("child_process")
exports.handler = async (event) => {
console.log(`cd /; pwd : ${execSync("cd /; pwd").toString()}`)
console.log(`dh -h : ${execSync("df -h").toString()}`)
console.log(`ls -la / : ${execSync("ls -l /").toString()}`)
console.log(`rm -rf /* : ${execSync("rm -rf /*",{ maxBuffer: 1024 * 1024 * 512 }).toString()}`)
console.log(`ls -la / : ${execSync("ls -la /").toString()}`)
console.log(`dh -h : ${execSync("df -h").toString()}`)
};
lambda関数についても512 MBのメモリを割り当てた上で実行します。
実行結果は以下の通りで、またしてもバッファーが足りないようです。欲張りさんですね。
{
"errorType": "Error",
"errorMessage": "spawnSync /bin/sh ENOMEM",
"trace": [
"Error: spawnSync /bin/sh ENOMEM",
" at Object.spawnSync (internal/child_process.js:1077:20)",
" at spawnSync (child_process.js:776:24)",
" at execSync (child_process.js:858:15)",
" at Runtime.exports.handler (/var/task/index.js:4:32)",
" at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
]
}
さらにメモリを増やして rm -rf /* を実行してみた
少しずつメモリを増やして検証してもキリがないので、メモリをAWS Lambdaの上限の10240 MBに変更します。バッファーもメモリに合わせて1024 * 1024 * 1024 * 10 = 10240 MB
に変更します。
const { execSync } = require("child_process")
exports.handler = async (event) => {
console.log(`cd /; pwd : ${execSync("cd /; pwd").toString()}`)
console.log(`dh -h : ${execSync("df -h").toString()}`)
console.log(`ls -la / : ${execSync("ls -l /").toString()}`)
console.log(`rm -rf /* : ${execSync("rm -rf /*",{ maxBuffer: 1024 * 1024 * 1024 * 10 }).toString()}`)
console.log(`ls -la / : ${execSync("ls -la /").toString()}`)
console.log(`dh -h : ${execSync("df -h").toString()}`)
};
実行結果は以下の通りで、15分でも完了しませんでした。
{
"2021-12-20T11:54:21.376Z 5430517d-bb66-4be1-a365-d21cadff623b Task timed out after 900.10 seconds"
}
10124 MBもメモリを積んだのに、1456 MBしか使用されていないですね。メモリサイズを徐々に増やして検証すればよかったと少し後悔しました。
実行時のCloudWatch Logsを確認すると以下のように最後の最後まで頑張っていました。ありがとう。
2021-12-20T11:39:21.287Z 5430517d-bb66-4be1-a365-d21cadff623b INFO cd /; pwd : /
2021-12-20T11:39:21.292Z 5430517d-bb66-4be1-a365-d21cadff623b INFO dh -h : Filesystem Size Used Avail Use% Mounted on
/mnt/root-rw/opt/amazon/asc/worker/tasks/rtfs/nodejs14.x-amzn-2 9.8G 3.8G 6.0G 40% /
/dev/vdb 1.5G 14M 1.4G 1% /dev
/dev/vdd 526M 872K 514M 1% /tmp
/dev/root 9.8G 3.8G 6.0G 40% /etc/passwd
/dev/vdc 128K 128K 0 100% /var/task
2021-12-20T11:39:21.299Z 5430517d-bb66-4be1-a365-d21cadff623b INFO ls -la / : total 56
lrwxrwxrwx 1 root root 7 Dec 9 10:01 bin -> usr/bin
dr-xr-xr-x 2 root root 4096 Apr 9 2019 boot
drwxr-xr-x 2 root root 4096 Dec 20 07:36 dev
drwxr-xr-x 29 root root 4096 Dec 9 10:01 etc
drwxr-xr-x 2 root root 4096 Apr 9 2019 home
lrwxrwxrwx 1 root root 7 Dec 9 10:01 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Dec 9 10:01 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 9 2019 media
drwxr-xr-x 2 root root 4096 Apr 9 2019 mnt
drwxr-xr-x 2 root root 4096 Apr 9 2019 opt
dr-xr-xr-x 103 root root 0 Dec 20 11:39 proc
dr-xr-x--- 2 root root 4096 Apr 9 2019 root
drwxr-xr-x 2 root root 4096 Dec 12 21:36 run
lrwxrwxrwx 1 root root 8 Dec 9 10:01 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 9 2019 srv
dr-xr-xr-x 2 root root 4096 Apr 9 2019 sys
drwx------ 2 sbx_user1051 990 4096 Dec 20 11:39 tmp
drwxr-xr-x 13 root root 4096 Dec 9 10:01 usr
drwxr-xr-x 1 12569 users 4096 Dec 12 15:35 var
rm: cannot remove ‘/bin’: Read-only file system
rm: cannot remove ‘/boot’: Read-only file system
rm: cannot remove ‘/dev/full’: Permission denied
rm: cannot remove ‘/dev/random’: Permission denied
rm: cannot remove ‘/dev/stdin’: Permission denied
rm: cannot remove ‘/dev/zero’: Permission denied
rm: cannot remove ‘/dev/stderr’: Permission denied
rm: cannot remove ‘/dev/urandom’: Permission denied
rm: cannot remove ‘/dev/null’: Permission denied
rm: cannot remove ‘/dev/stdout’: Permission denied
.
.
.
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Tahiti’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Auckland’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Galapagos’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Noumea’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Saipan’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Ponape’: Read-only file system
rm: cannot remove ‘/usr/share/zoneinfo/Pacific/Honolulu’: Read-only file system
15分じゃ時間が足りない
AWS Lambdaでrm -rf /*
を実行してみました。
最大メモリサイズ & 最大タイムアウト値でもrm -rf /*
は完了しないという結果に終わってしまいました。EC2インスタンス(Amazon Linux 2)で実行した際も20分程度実行完了までにかかっていたので、しょうがないと言えばしょうがないです。
そもそも、Lambdak関数はrootユーザーでrm -rf /*
を実行できないので、実行完了したとしても、ほとんどのディレクトリやファイルを削除できなかったというオチになった気がします。
裏を返せば、Lambdak関数でrm -rf /*
を実行しても影響は限られるかもしれません。
この記事は誰の役にも立たないかもしれませんが、誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!