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 기준이며 로컬 작업디렉토리에 생성을 합니다.

index.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:


오늘날의 서버는 클라우드가 가속화되면서 무게라는 장비개념이 사라졌으며 작동코드는 더 작은 실행단위로 구동이 됩니다.

서버리스 함수형은 가장 작은단위로 수행되지만 실행시간단위로 비용이 부과될수 있으며 예측하기가 어려우며

관리가 필요없는 관리되는 클라우드 요소가 항상 좋은것은 아닙니다.

OpenStack을 도커 Ec2기반으로 구성하면 일반적으로 동일한 스펙에서 관리되는 AWS Stack보다 훨씬 저렴하며

EC2보다 훨씬 저렴한 Vargrant로 프로비저닝 되는 VM환경을 채택할수도 있습니다.

  • IDC센터(장비무게 10kg ) > VM(Vargrant ) / AWS EC2 ( OS 1GB) > DockerContainer( 200mb ) > 클라우드 함수 / AWS Lambda(100kb 이내)



  • No labels
Write a comment…