2021년 11월 18일 목요일

[ AWS ] SAM을 통한 Lambda Layer with Pycharm

Pycharm 환경에서 Layer를 생성하고 

배포하는 과정이다.


아래 과정 이후에 진행하면 도움이 된다.

[ AWS ] SAM을 통한 Lambda 개발환경 셋팅

[ AWS ] SAM을 통한 Lambda Local Debugging


1. Layer 선언

프로젝트에 패키지 하나를 따로 생성해 

Layer로 쓸 function들을 정의한다.

이후 template.yaml 파일에 

해당 패키지를 mapping해준다.


[ template.yaml ]

TestCommon:

    Type: AWS::Serverless::LayerVersion

    Properties:

      ContentUri: test_common/

      CompatibleRuntimes:

        - python3.9

      LayerName: test_common

      RetentionPolicy: Retain


명시한 Layer(TestCommon)를

배포 시 해당 함수에 물리게끔 하는 작업이 필요하다.

2가지 방법이 있는데,

Globals부분 또는 Resoureces 부분에 명시한다.


[ template.yaml ]

Globals:

  Function:

    Timeout: 600

    MemorySize: 128

    Tracing: Active

    Layers:

      # 택1

      - !Ref TestCommon 

      ( or )

      # 택2 - 미리 Lambda Layer에 Upload 되어있을 시

      - arn:aws:lambda:ap-northeast-2:123123:layer:test_common:1


Resources:

  HelloWorld:

      ...

      Layers:

        - !Ref TestCommon


Globals부분에 선언하면 Resources하위 Function에 다 적용이 되어서

한번만 적으면 되어 편리함이 있지만,

각 Function마다 Layer를 다르게 설정할 경우에는 

Resources부분에 각각 적용한다.


Lambda Layer 만들기 참고 Ref : 

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html


이후 아래 명령어로 배포하면 Function과 Layer 모두 Lambda에 업데이트 된다.

sam deploy --stack-name testLambda --s3-bucket test-dighty-appinstall



2. Layer 폴더추가 

a. 해당 구조로 생성


b. layer는 sam build시에도 build 디렉토리에 나타나지 않음




3. Package 정리 Layer

업로드 된 람다 함수의 코드를 보면 

아래 그림과 같이 import하는 패키지들도 같이 업로드 된다.













이 패키지들을 Layer로 만들면 

재사용하기도 쉽고 파일도 깔끔해질 것이다.


a. 업로드할 Lamba Function의 Package의 requirements 비운다.

b. layer로 사용할 directory를 만든 후, requirements.txt파일에 필요한 library를

   pip freeze 등의 명령어로 input 

c. 해당 명령어 실행

pip install -r ./package_layer/requirements.txt -t ./package_layer/

d. 디렉토리에 관련 lib설치 확인













e. template.yaml에서 Metadata설정 추가

TestCommon:

    Type: AWS::Serverless::LayerVersion

    Properties:

        ContentUri: test_common

        CompatibleRuntimes:

            - python3.9

        LayerName: test_common

        RetentionPolicy: Retain

    Metadata:

        BuildMethod: python3.9

f. sam bulid

g. build 디렉토리에서 Layer만 따로 빌드된 폴더가 추가됨














이제 sam deploy로 배포하면

Lambda 프로젝트 폴더 안에 관련 패키지가 없음에도 

import하여 사용할 수 있다.









CloudWatch에서 해당 람다함수 로그까지 확인한다.


참조 : https://aws.plainenglish.io/a-practical-guide-surviving-aws-sam-part-3-lambda-layers-8a55eb5d2cbe


2021년 11월 17일 수요일

[ AWS ] SAM을 통한 Lambda Local Debugging


아래 단계의 다음 단계이다.

Sam을 통한 Pycharm Lambda 개발환경 셋팅

 

1. template.yaml 파일 수정

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
test description 

# Global 설정 Layer선언 부분
Globals:
  Function:
    Timeout: 3

# 람다 함수 관련 부분
Resources:

  # 대표이름, sam build시 해당 이름으로 폴더가 생성됨
  HelloWorld:
    Type: AWS::Serverless::Function

    Properties:
      # 해당 폴더가 있는 URL ( ex. myPycharmProject/sam-app/hello_world/app.py )
      CodeUri: hello_world/
      # 함수명, Lambda에서 보여질 이름
      FunctionName: test_hello_world
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
      - x86_64
      # AWS IAM Role. 관련 Role이 없다면 sam delploy -g 를 통해 배포 시 자동생성
      Role: 'arn:aws:iam::123123123:role/lambdaEtlRole'

#      #Web Api, S3 Trigger 등 Event 선언 부분
#      Events:
#        HelloWorld:
#          Type: Api
#          Properties:
#            Path: /hello
#            Method: get

  # 한 프로젝트에 여러 Lambda 함수를 정의하고 싶을 때 이어서 쓰면 된다.
  HelloWorld_2:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world_2/
      FunctionName: hello_world_2
      Handler: app.lambda_handler
      Runtime: python3.9
.....



2. Edit Configurations

a. 최상단의 Run/Debug 종류를 고르는 select box에서 edit configurations를 클릭


b. 위 이미지의 좌측 상단에 '+'를 클릭해 AWS Lambda 선택

c. from template 선택 -> template.yaml 지정 -> 함수 지정 -> input 데이터 지정

d. Apply 후 Ok, Run 실행



3. Local Debugging

braekpoint를 찍어 디버깅이 잘 되는지 확인





















[ AWS ] SAM을 통한 Lambda 개발환경 셋팅

[ 사전 설정 ]

1. aws cli

OS별 설치 방법 : https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2.html


2. aws sam cli

OS별 설치 방법 : https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html


3. docker 설치

Run Function을 하게 되면 Docker 환경에서 실행 됨

Mac OS일 경우 마운트 경로 추가










4. pycharm 설정

plugin에서 aws toolkit을 검색 하여 설치













aws설치 path가 잘 잡혔는지 확인













프로젝트 생성














[ SAM 명령어 ]


Step 1 - Download a sample application

$ sam init


Step 2 - Build your application

$ cd sam-app

( 코드 추가 or 수정 )

$ sam build

$ sam local invoke


Step 3 - Deploy your application

$ sam deploy --guided

or 

$ sam deploy --stack-name testLambda --s3-bucket test-bucket-name


Sam Deploy Option Ref : 

https://aws.amazon.com/ko/blogs/compute/a-simpler-deployment-experience-with-aws-sam-cli/

Sam Example Ref : 

https://docs.aws.amazon.com/ko_kr/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html

AWS Toolkit Ref : 

https://docs.aws.amazon.com/ko_kr/toolkit-for-jetbrains/latest/userguide/welcome.html



[ AWS ] 

배포 일련의 과정을 보자면

-> Lambda 애플리케이션의 코드를 압축해 S3에 업로드

-> CodeUri가 S3 path로 설정된 CloudFormation template파일 생성, S3에 업로드

-> S3에 업로드된 파일을 이용해서 CloudFormation 스택을 생성해서 Lambda에 배포


CloudFront 과 S3를 살펴보면

배포 관련 Stack과 S3안에 파일이 생성된 것을 볼 수 있다.



2021년 11월 15일 월요일

[ Git ] 기본 명령어

[ 저장소 ]

git remote

  - git 원격저장소[Repository] 목록 확인

git remote -v

  - git 원격저장소 이름과 url 목록 확인

git remote add 저장소이름 저장소URL 

  - 저장소URL의 원격저장소를 저장소이름으로 추가

git remote rm 저장소이름

  - 저장소이름의 원격저장소 제거


[ 확인 ]

git log

  - commit 로그 확인

git status

  - 파일 상태 확인(staged, untracked, ..)

git diff

  - commit된 파일상태와 현재 수정중인 상태 비교

git diff --staged

  - commit된 파일상태와 add된 파일 상태 비교


[ 업로드 ]

git add 파일명1 파일명2

  - 해당 파일을 [Staging Area]로 이동(tracking)

git commit -m "커밋메세지"

  - editor 호출없이 바로 커밋

git push

  - 원격저장소[Repository]에 local repository[Working Directory]의 commit 내용을 올림


[ 다운로드 ]

git pull

  - 원격저장소[Repository]의 내용을 가져와서(fetch) local repository[Working Directory]에 합침(merge)



[ 브런치 ]

git branch <브랜치 이름>

 - 브런치생성

git checkout <브랜치 이름>

 - 사용할 브런치로 변경

git branch -r (-a는 로컬원격전부 확인)

 - 원격브런치 목록확인


git push origin <브랜치 이름> 

 - 로컬브런치를 원격브런치로 추가

git branch --set-upstream-to origin/<브랜치 이름> 

 - 로컬브런치와 원격브런치 연동


git branch -d <브랜치 이름>

 - 브런치 삭제

git push origin --delete <브랜치 이름>

 - 원격저장소 브런치 삭제



[ 브런치 병합 ]

git checkout master

 - master사용

git branch -a 

 - checkout 바뀌었는지 확인

git merge <브런치 이름>

 - 병합

git push

 - 원격저장소에 병합할 경우 



[ 초기설정 ]

git init

git add .

git commit -m 'init'

github에서 프로젝트 생성

git remote add origin https://github.name.com/42f-platfrom/00000.git

git push --set-upstream origin master



[ git reset ]

git reset COMMIT_ID

- 로컬 저장소 원하는 commit 시점으로 리셋


git push -f origin master

- 원격 저장소 롤백



https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html



2021년 11월 13일 토요일

[ Glue ] SageMaker와 Job Script 사용 시 Spark Session 차이점


SageMaker는 Spark-Shell과 같이 실행 시 Spark 세션 변수가 초기화 된다.

따로 define하지 않아도 print(spark) 하면 값이 할당 된 것을 볼 수 있다.

추가로 spark session 변수를 할당 하여 작업 시, 여러가지 에러를 맛본다.

반면에 Glue Job Script는 Spark 세션변수를 선언해줘야 한다.



[ SageMaker ]

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
glueContext = GlueContext(SparkContext.getOrCreate())

df = spark.createDataFrame(
    [(1, "foo", "USA"),(2, "bar", "KOREA"),],
    ["id", "label", "country"]
)

df.printSchema()
df.createOrReplaceTempView("test")
spark.sql("select * from test").show()




[ Glue Job Script ]

import ...

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

....
job.commit()

[ AWS ] CloudWatch로 경보알림 설정

 [ elasticach redis에 cpu / memory 70%이상 사용시 경보 ]


1. CloudWatch 접속

https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#alarmsV2:alarm/elasticach-memory?

참조 : https://aws.amazon.com/ko/elasticache/redis/faqs/


2. 좌측경보메뉴 클릭 -> 경보생성


3. 해당지표 검색하여 경보생성

- CPU 관련 지표 : EngineCPUUtilization

- 메모리관련 지표 : DatabaseMemoryUsagePercentage


4. Amazon SNS에서 주제/구독 생성 및 확인


5. 구독시 설정한 메일에서 구독확인



지표 레지스터 정리표

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/classic/elb-cloudwatch-metrics.html#loadbalancing-metrics-clb

[ Nifi ] Firebase Bigquery Nifi 연결

파이어베이스 BigQuery 설정

 https://spiralmoon.tistory.com/entry/Firebase-Firebase%EC%97%90-BigQuery-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0


서비스계정만들기 

https://cloud.google.com/docs/authentication/getting-started?hl=ko


Bigquery jdbc driver jar 다운로드

https://dbschema.com/jdbc-driver/GoogleBigQuery.html

  • Required File(s): googlebigqueryjdbc42.jar
  • Java Driver Class: com.simba.googlebigquery.jdbc42.Driver
  • URL: jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId={DB};OAuthType=1;
  • Website: Google Big Query

심바 JDBC PDF
file:///C:/Program%20Files/Simba%20ODBC%20Driver%20for%20Google%20BigQuery/Simba%20ODBC%20Driver%20for%20Google%20BigQuery%20Install%20and%20Configuration%20Guide.pdf


각 나이파이 lib디렉토리에
google-http-client-jackson2-1.28.0.jar
google-api-client-1.28.0.jar
GoogleBigQueryJDBC42.jar 
추가


구글클라우드콘솔
https://console.cloud.google.com/bigquery?project=zeliter-1337

Bigquery에 연결하는 7가지 방법
https://hevodata.com/learn/bigquery-etl-tools/#b7