LocalStack은 함수형 작동도 AWS와 유사하게 작동지원을 하며
서버리스의 장점이 있으나~ 클라우드 비용없이 간단한 함수를 작동해볼수 있습니다.
DataLake에서는 간단한 ETL을 익숙한 언어로 작동하고자할때 활용될수있습니다.
일반적으로 Jupyter와 같은 Notebook에서 작동검증된 코드를 작동시킬때 등록시도해볼수 있습니다.
ETL은 추출(Extract), 변환(Transform), 로드(Load)를 의미합니다.
사용된 도커구성 - Dockercompose
version: '3' services: localstack: image: localstack/localstack:3.0.2 ports: - "4567:4566" environment: - SERVICES=s3:4566,iam,lambda - HOSTNAME_EXTERNAL=localstack - AWS_ACCESS_KEY_ID=test - AWS_SECRET_ACCESS_KEY=test - AWS_DEFAULT_REGION=us-east-1 volumes: - "/var/run/docker.sock:/var/run/docker.sock" labels: io.rancher.scheduler.affinity:host_label: server=lake01 io.rancher.container.hostname_override: container_name
이 스크립트는 우분투(WSL2) 기반에서 작동검증 되었습니다.
AWS TestKey 설정
aws configure - AWS_ACCESS_KEY_ID=test - AWS_SECRET_ACCESS_KEY=test - AWS_DEFAULT_REGION=us-east-1
AWS CLI툴을 이용해 클라우드 이용과 동일하게 이용할수 있습니다.
endpoint의 설정이 없으면 AWS Cloud를 이용하며 지정하게 될시 구동된 Stack을 이용하게됩니다.
--endpoint-url=http:
//localhost:4567
IAM Role 설정
우리가 작성한 함수를 실행하기위해서는 AWS에서도 실행권한이 필요하며, 로컬스택에서도 동일하게 RoleBase로 작동됩니다.
여기서 함수는 함수형개발과 무관한 작동가능한 Function을 의미합니다.
aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}' --endpoint-url=http://localhost:4567 aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole --endpoint-url=http://localhost:4567
함수 등록및 구동
작동함수작성
node.js 기준이며 로컬 작업디렉토리에 생성을 합니다.
exports.handler = async function(event, context) { console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2)) console.log("EVENT\n" + JSON.stringify(event, null, 2)) return context.logStreamName }
다양한 언어를 지원하며 OpenStack의 지원스펙은 버전에따라 다를수 있습니다.
링크 : https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-handler.html
함수등록
패키지(압축)화 해서 함수등록이 가능하며, 실행함수를 압축합니다.
코드가 복잡하면 언어가 지원하는 범위에서 여러파일을 등록해 기능별 클래스화도 가능합니다.
zip function.zip index.js aws lambda create-function --function-name my-function \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs20.x \ --role arn:aws:iam::123456789012:role/lambda-ex --endpoint-url=http://localhost:4567
실행및 수행결과 로그보기
aws lambda invoke --function-name my-function out --log-type Tail --endpoint-url=http://localhost:4567 \ --query 'LogResult' --output text | base64 -d
보너스
함수형언어를 채택하여 클라우드에 운영하는것이 아니라고하면~
격리된 개발환경에서 vscode를 리모트로 이용할수 있는 code-server 도 추천해봅니다.
서버리스보다는 애니웨어 코드실행에 가깝습니다.
version: "2" services: code-server: image: lscr.io/linuxserver/code-server:latest container_name: code-server # stop 상태가 되지 않는 이상 재시작 restart: always ports: - "8443:8443" environment: # Container 내의 시간대를 대한민국으로 설정 TZ: Asia/Seoul # code-space에 진입할 때 비밀번호를 입력하게 할려면 이 내용을 설정 PASSWORD: webnoridev # 기본 Workspace 위치 지정 (Container 내 경로로) DEFAULT_WORKSPACE: /config/workspace volumes: # VSCode의 설정이 저장될 위치 -> 컨테이너가 재시작 되어도 설정이 초기화 되지 않도록 조치 - codespace-config:/config # Workspace을 Host와 연결 - /opt/vscode:/config/workspace labels: io.rancher.scheduler.affinity:host_label: server=home01 io.rancher.container.hostname_override: container_name volumes: codespace-config:
오늘날의 서버는 클라우드가 가속화되면서 무게라는 장비개념이 사라졌으며 작동코드는 더 작은 실행단위로 구동이 됩니다.
서버리스 함수형은 가장 작은단위로 수행되지만 실행시간단위로 비용이 부과될수 있으며 예측하기가 어려우며
VM을 포함 IDC센터의 장비가 더 무겁다고해서 항상 나쁜것은아닙니다.
클라우드를 활용하면서도 클라우드 비용을 억제할수 있는 하이브리드 전략을 채택해 클라우드가 제공하지 못하는 온프레미스 하드웨어도 선택가능해야합니다.
- IDC센터(장비무게 10kg ) > VM(Vargrant ) / AWS EC2 ( OS 1GB) > DockerContainer( 200mb ) > 클라우드 함수 / AWS Lambda(100kb 이내)