[aws] Lambda 파헤치기

2022. 9. 4. 23:20✅ STUDY/AWS

안녕하세요 🙂

오늘은 Lambda 개념에 이어, Lambda를 더욱 파헤쳐보려 합니다!
Lambda 개념 및 사용법은 아래 링크를 참조해주세요.

 

[aws] Lambda 개념 및 사용법

안녕하세요 :) 오늘은 AWS Lambda에 대해 설명드리려 합니다. AWS Lambda Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스 입니다. [특징] 자신의 코드에

minjii-ya.tistory.com

 

Lambda의 특장점 중 하나가 바로, "자신의 코드에 대해서만 책임진다"는 것 인데요.

자세히 말하면, Lambda는 사용자를 대신하여 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 코드 모니터링 및 로깅 등 모든 컴퓨팅 리소스 관리를 수행하기 때문에 사용자는 서버를 신경쓰지 않고 자신의 코드에 대해서만 책임지면 된다는 것 입니다.

이에, 사용자는 컴퓨팅 인스턴스에 로그인하거나 제공된 런타임에 운영 체제를 정할 수 없습니다.

그렇다면, AWS는 Lambda를 어떤 OS, 어떤 파일시스템을 관리하고 있을까요?
문득 궁금해져 python 3.9 런타임 환경을 가지고 있는 Lambda에 subprocess 라이브러리를 활용하여
이것저것 테스트를 해보았습니다.

Lambda의 내부 동작 방식을 제가 정확하게는 모르기 때문에 이것저것 테스트 한 것이니,
잘못된 점이 있다면 댓글로 정정 부탁드립니다!




OS 정보 확인

import json, subprocess

def lambda_handler(event, context):
    subprocess.run(["cat /etc/os-release"], check = True, shell = True)
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="202205231235-2.0.821.0"

📌 Lambda는 Amazon Linux 2 기반의 OS에서 실행됩니다.


import json, subprocess

def lambda_handler(event, context):
    subprocess.run(["uname -a"], check = True, shell = True)
Linux 169.254.9.129 4.14.255-276-224.499.amzn2.x86_64 #1 SMP Tue May 3 22:30:10 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Kernel name - Linux
Host node name - 169.254.9.129
Kernel release - 4.14.255-276-224.499.amzn2.x86_64
Kernel version and build time - #1 SMP Tue May 3 22:30:10 UTC 2022
Processor type, hardware platform and architecture of processor - x86_64 x86_64 x86_64
Operating system name - GNU/Linux

📌 AMD/Intel 64비트의 프로세서 기반으로 실행됩니다. 또한, hostname은 호출 시 일정 시간이 지나면 계속 변경됩니다.

 

사용자 정보 확인

/etc/passwd 이란, 시스템에 등록된 사용자의 정보들이 담겨있는 파일입니다.
이 파일을 이용해서 사용자의 계정과 인증을 관리하게 됩니다.

import json, subprocess

def lambda_handler(event, context):
    subprocess.run(["cat /etc/passwd"], check = True, shell = True)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rngd:x:999:996:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
slicer:x:998:995::/tmp:/sbin/nologin
sb_logger:x:997:994::/tmp:/sbin/nologin
ec2-user:x:996:993::/home/ec2-user:/bin/bash
shim_1:x:995:992::/home/shim_1:/sbin/nologin
shim_2:x:994:991::/home/shim_2:/sbin/nologin
sbx_user1051:x:993:990::/home/sbx_user1051:/sbin/nologin
sbx_user1052:x:992:989::/home/sbx_user1052:/sbin/nologin
sbx_user1053:x:991:988::/home/sbx_user1053:/sbin/nologin
sbx_user1054:x:990:987::/home/sbx_user1054:/sbin/nologin
sbx_user1055:x:989:986::/home/sbx_user1055:/sbin/nologin
sbx_user1056:x:988:985::/home/sbx_user1056:/sbin/nologin
sbx_user1057:x:987:984::/home/sbx_user1057:/sbin/nologin
.....
sbx_user1174:x:870:867::/home/sbx_user1174:/sbin/nologin
sbx_user1175:x:869:866::/home/sbx_user1175:/sbin/nologin
sbx_user1176:x:868:865::/home/sbx_user1176:/sbin/nologin

📌 shell 사용 불가, ssh 접근 불가, 홈 디렉토리 사용 불가, 로그인이 되지 않는 사용자 계정(/sbin/nologin)이 여러개 생성되어 있습니다.

 

현재 사용자 정보 확인

import json, subprocess

def lambda_handler(event, context):
    subprocess.run(["whoami"], check = True, shell = True)
sbx_user1051

📌 현재 Lambda는 sbx_user1051 이라는 사용자 계정을 사용 중 입니다.

 

파일 시스템 확인

import json, subprocess

def lambda_handler(event, context):
    subprocess.run(["df -TH"], check = True, shell = True)
Filesystem                                                     Type     Size  Used Avail Use% Mounted on
/mnt/root-rw/opt/amazon/asc/worker/tasks/rtfs/python3.9-amzn-2 overlay   72G   58G   11G  85% /
/dev/vdb                                                       ext4     1.6G   15M  1.5G   1% /dev
/dev/vdd                                                       ext4     552M  893k  539M   1% /tmp
/dev/root                                                      ext4      11G  569M  9.9G   6% /etc/passw

📌 Lambda에서 임시 스토리지로 사용할 수 있는 /tmp는 현재 Lambda의 임시 스토리지 설정 만큼 크기가 할당되어 있습니다.
/tmp는 512MB ~ 10240MB 사이로 설정 가능합니다.

/(root) 파일 목록 확인

drwxr-xr-x  1 root         root  4096 Jan  1  1970 var
dr-xr-xr-x  2 root         root  4096 Apr  9  2019 sys
drwxr-xr-x  2 root         root  4096 Apr  9  2019 srv
dr-xr-x---  2 root         root  4096 Apr  9  2019 root
drwxr-xr-x  2 root         root  4096 Apr  9  2019 mnt
drwxr-xr-x  2 root         root  4096 Apr  9  2019 media
drwxr-xr-x  2 root         root  4096 Apr  9  2019 home
dr-xr-xr-x  2 root         root  4096 Apr  9  2019 boot
drwxr-xr-x  7 root         root    88 Oct 19  2020 opt
lrwxrwxrwx  1 root         root     8 May 23 12:37 sbin -> usr/sbin
lrwxrwxrwx  1 root         root     9 May 23 12:37 lib64 -> usr/lib64
lrwxrwxrwx  1 root         root     7 May 23 12:37 lib -> usr/lib
lrwxrwxrwx  1 root         root     7 May 23 12:37 bin -> usr/bin
drwxr-xr-x 30 root         root  4096 May 23 12:38 etc
drwxr-xr-x  2 root         root  4096 May 23 12:38 run
drwxr-xr-x  1 root         root  4096 May 25 09:04 usr
drwxr-xr-x  1 root         root  4096 May 25 09:04 ..
drwxr-xr-x  1 root         root  4096 May 25 09:04 .
-rw-r--r--  1 root         root 53718 Jun 10 16:36 THIRD-PARTY-LICENSES.txt
-rwxr-xr-x  1 root         root   397 Jun 11 17:06 lambda-entrypoint.sh
drwxr-xr-x  2 root         root  4096 Oct  2 09:57 dev
dr-xr-xr-x 72 root         root     0 Oct  2 10:03 proc
drwx------  2 sbx_user1051  990  4096 Oct  2 10:03 tmp


/var/task 파일 목록 확인

total 5
drwxr-xr-x 1 root root 4096 Jan  1  1970 ..
-rwxr-xr-x 1 root root  122 Sep  4 07:00 lambda_function.py
drwxr-xr-x 2 root root   41 Sep  4 07:00 .

📌 우리가 정의하는 lambda_function.py는 /var/task에 위치하고 있습니다.


/dev 파일 목록 확인

total 8
drwxr-xr-x 1 root root 4096 May 25 09:04 ..
crw-rw-rw- 1 root root 1, 5 Sep  4 06:52 zero
crw-rw-rw- 1 root root 1, 9 Sep  4 06:52 urandom
lrwxrwxrwx 1 root root   15 Sep  4 06:52 stdout -> /proc/self/fd/1
lrwxrwxrwx 1 root root   15 Sep  4 06:52 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root   15 Sep  4 06:52 stderr -> /proc/self/fd/2
crw-rw-rw- 1 root root 1, 8 Sep  4 06:52 random
crw-rw-rw- 1 root root 1, 3 Sep  4 06:52 null
crw-rw-rw- 1 root root 1, 7 Sep  4 06:52 full
drwxr-xr-x 2 root root 4096 Sep  4 06:52 .

📌 /dev는 어디에 사용하는지는 모르지만, /dev를 임시 스토리지로 사용할 수는 없습니다.


/tmp 파일 확인

total 8
drwxr-xr-x 1 root         root 4096 May 25 09:04 ..
drwx------ 2 sbx_user1051  990 4096 Sep  4 07:02 .

📌 Lambda에서 임시 스토리지로 사용할 수 있는 /tmp는 sbx_user1051 소유권을 가져 파일을 읽거나 쓰거나 실행도 가능합니다.


/opt/bin 파일 확인

layer로 구성한 파일은 /opt/bin 경로에서 확인 가능합니다.
저의 경우, git이 layer로 구성되어 있습니다.

import json, subprocess

def lambda_handler(event, context):
    subprocess.run(["ls -alrt /opt/bin"], check = True, shell = True)
-rwxr-xr-x 1 root root   13632 Oct 29  2019 fipshmac
-rwxr-xr-x 1 root root   15264 Oct 29  2019 fipscheck
-rwxr-xr-x 1 root root 1557984 Dec 12  2019 ssh-keyscan
-rwxr-xr-x 1 root root 1412136 Dec 12  2019 ssh-keygen
-r-x--x--x 1 root root 1233864 Dec 12  2019 ssh-agent
-rwxr-xr-x 1 root root 1142400 Dec 12  2019 ssh-add
-rwxr-xr-x 1 root root 2837968 Dec 12  2019 ssh
-rwxr-xr-x 1 root root  546424 Dec 12  2019 sftp
-rwxr-xr-x 1 root root  334280 Dec 12  2019 scp
-rwxr-xr-x 1 root root   10469 Dec 12  2019 ssh-copy-id
-rwxr-xr-x 1 root root 1749120 Oct 19  2020 git-shell
-rwxr-xr-x 1 root root 3291760 Oct 19  2020 git
drwxr-xr-x 2 root root     285 Oct 19  2020 .
lrwxrwxrwx 1 root root       5 Oct 19  2020 slogin -> ./ssh
lrwxrwxrwx 1 root root       3 Oct 19  2020 git-upload-pack -> git
lrwxrwxrwx 1 root root       3 Oct 19  2020 git-upload-archive -> git
lrwxrwxrwx 1 root root       3 Oct 19  2020 git-receive-pack -> git
drwxr-xr-x 7 root root      88 Oct 19  2020 ..

📌 Layer로 구성된 패키지는 /opt/bin 경로에 있습니다.