You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Current »

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:


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

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

VM을 포함 IDC센터의 장비가 더 무겁다고해서 항상 나쁜것은아닙니다.

클라우드를 활용하면서도 클라우드 비용을 억제할수 있는 하이브리드 전략을 채택해 클라우드가 제공하지 못하는  온프레미스 하드웨어도 선택가능해야합니다.

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



  • No labels