Ch04 서버리스 어플리케이션 개발 (2)
16. Lambda Layer 패키지 작성방법
17. 참가증 이미지 만들기 - 1
18. 참가증 이미지 만들기 - 2
Lmabda python 패키지 추가하기
lamda함수에 사용할 패키지를 설치하기 위해서는 layer기능을 사용하여 python 패키지를 추가해야한다. 아래 공식문서를 참고한다.
docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html#configuration-layers-using
AWS Lambda 계층 - AWS Lambda
AWS Lambda 계층 Lambda 함수는 추가 코드와 콘텐츠를 계층의 형태로 가져오도록 구성할 수 있습니다. 하나의 계층은 라이브러리, 사용자 지정 런타임 또는 그 외 종속성을 포함하는 ZIP 아카이브입니
docs.aws.amazon.com
pillow, qrcode 패키지를 사용하기 위한 레이어를 만들어본다. lamda와 같은 가상환경 터미널에서 작업한다. ec2 amazon linux를 사용하거나 docker 이미지로 가능하다. 아래는 강사님 도커 이미지 github 주소이다.
github.com/hidekuma/lambda-layers-for-python-runtime
hidekuma/lambda-layers-for-python-runtime
📂 Create a Python package zip file for use in AWS lambda layers - hidekuma/lambda-layers-for-python-runtime
github.com
mkdir python
특정 경로에 패키지 설치하기
pip install pillow qrcode -t python/
필요없는 파일,디렉토리 삭제
rm -rf __pychace__
zip -r output.zip python/
aws람다에서 압축파일을 적용하여 새로운 계층을 추가한다.
lambd에서 생성한 계층을 추가해본다.
참가증 이미지 생성하기
참가증에 필요한 폰트와 이미지를 s3에 업로드 한뒤 lambda에서 사용해보자. 무료 폰트와 적당한 이미지를 s3에 업로드했다.
lambdad에서 s3 파일을 다운로드 시간을 고려해서 제한시간을 늘려준다.
참가증은 sns에 등록된 user_id를 기반으로 만들어야 하니 sns 테스트 데이터를 생성한다.
Records 배열에 첫번재 요소의 Sns 에서 message와 subject를 사용할 것이다. 전체 lambda 코드는 아래와 같다.
import json
from PIL import Image, ImageDraw, ImageFont
import qrcode
import boto3
import os
def lambda_handler(event, context):
# 1) s3 -> download -> font, img -> tmp
s3 = boto3.resource('s3')
s3.Bucket(os.environ['BUCKET_NAME']).download_file('fonts/{font_name}.otf', '/tmp/font.otf')
s3.Bucket(os.environ['BUCKET_NAME']).download_file('imgs/{logo_name}.png', '/tmp/logo.png')
# 2) records -> get -> table -> getitem
records = event['Records']
if records:
user_id = records[0]['Sns']['Message']
conf_type = records[0]['Sns']['Subject']
# 3) dynamodb get
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ['TABLE_NAME'])
r = table.get_item(
Key={
'user_id': user_id,
'type': conf_type
}
)
item = r['Item']
phone_number = item.get('phone_number', '')
company_name = item.get('company_name', '')
user_name = item.get('user_name', '')
# 4) image build
W, H = (400, 250)
# 1) logo img
logo = Image.open('/tmp/logo.png')
ttf = '/tmp/font.otf'
# 2) qr code img
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=4,
border=4,
)
qr.add_data(phone_number)
qr.make(fit=True)
qr_img = qr.make_image(fill_color="black", back_color="white")
# 3) merge
img = Image.new('RGB', (W, H), color='#fff')
img.paste(logo, (15, 15), logo)
img.paste(qr_img, (15, 100))
# 4) draw
font_m = ImageFont.truetype(ttf, 15)
font_b = ImageFont.truetype(ttf, 20)
font_B = ImageFont.truetype(ttf, 22)
draw = ImageDraw.Draw(img)
draw.text((150, 110), user_name, fill='#000', font=font_b)
draw.text((150, 140), f'From {company_name}', fill='#000', font=font_m)
draw.rectangle((145, 170, 375, 205), fill='#f0f0f0')
draw.text((150, 170), 'FULL CONFERENCE PASS', fill='#ed244b', font=font_B)
img.save(f'/tmp/signed.jpg', quality=100)
key = f'qrcodes/{user_id}/{conf_type}/qrcode.jpg'
s3.meta.client.upload_file('/tmp/signed.jpg', os.environ['BUCKET_NAME'], key, ExtraArgs={'ContentType':'image/jpeg'})
return {
'statusCode': 200,
'event': event
}
sns에 토픽이 추가 되는 시점에 lambda실행 되도록 트리거를 추가한다.
테스트를 위해 dynamo에서 새로운 데이터를 추가하고 sns에서 메세지를 추가한다 제목(subject)과 앤드포인트로 전송할 메세지 본문(message)을 추가한다.
sns 메세지 게시하게 되면 s3에 참가증이 추가되는 것을 확인 할 수 있다.
postRole lambda에서 테스트를 하게 되면 s3로 메세지로 게시하고 sns가 람다를 호출하여 s3에 참가증을 업로드하는 과정을 구성하였다.
19일 차 마무리
lambda에서 dynamo로 데이터를 등록하고 sns에 메세지를 게시하여 다른 lambda를 실행하는 과정을 직접 구현하는 시간이었다. aws서비스간의 상호작용을 직접 실습하는 프로젝트라 큰 도움이 되는 강의다.
현재 수강 중인 강의는 아래와 같다
올인원 패키지 : AWS/Docker 클라우드 서버구축👉https://bit.ly/3bFlm0e