Skip to content

Commit

Permalink
added source code
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremycook123 committed Dec 3, 2023
1 parent 4a3e5ef commit be0c1c7
Show file tree
Hide file tree
Showing 4 changed files with 190 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
package
*.zip
94 changes: 94 additions & 0 deletions lambda_function.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import json
import boto3
import logging
import os
import textwrap
import time

from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all

patch_all()

logger = logging.getLogger()
logger.setLevel(logging.INFO)

s3_bucknet_name = os.environ.get("S3_BUCKET_NAME")

logger.info(f's3 bucket name: {s3_bucknet_name}')

s3 = boto3.client('s3')

def lambda_handler(event, context):
logger.info('calculates pi to n decimal places...')

subsegment = xray_recorder.begin_subsegment('pi-calc')

num = 1000
try:
num = int(event["queryStringParameters"]['num'])
logger.info(f'num: {num}')
except:
logger.warning('error parsing num from query string')
pass

subsegment.put_annotation('num', num)

pi = 0

try:
digits = [str(n) for n in list(pi_digits(int(num)))]
pi = "%s.%s\n" % (digits.pop(0), "".join(digits))
logger.info(f'pi: {pi}')
time.sleep(10) #simulate long running task
except:
logger.error('error calculating pi')
return {
"statusCode": 503,
"isBase64Encoded": False,
"headers": {
"Content-Type": "application/json"
},
"body": 0
}

subsegment.put_metadata("pi", pi)
xray_recorder.end_subsegment()

pi_wrapped = "\n".join(textwrap.wrap(pi,32))

if s3_bucknet_name:
subsegment = xray_recorder.begin_subsegment('s3-save')
subsegment.put_annotation('num', num)
subsegment.put_metadata("pi_wrapped", pi_wrapped)

file_name = "pi.txt"
s3_path = "data/" + file_name

logger.info('saving pi to s3 bucket...')
s3 = boto3.resource("s3")
s3.Bucket(s3_bucknet_name).put_object(Key=s3_path, Body=pi_wrapped.encode("utf-8"))

xray_recorder.end_subsegment()

logger.info('returning response...')
return {
"statusCode": 200,
"isBase64Encoded": False,
"headers": {
"Content-Type": "application/json"
},
"body": pi_wrapped
}

def pi_digits(x):
k,a,b,a1,b1 = 2,4,1,12,4
while x > 0:
p,q,k = k * k, 2 * k + 1, k + 1
a,b,a1,b1 = a1, b1, p*a + q*a1, p*b + q*b1
d,d1 = a/b, a1/b1
while d == d1 and x > 0:
yield int(d)
x -= 1
a,a1 = 10*(a % b), 10*(a1 % b1)
d,d1 = a/b, a1/b1
92 changes: 92 additions & 0 deletions makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
export LAMBDA_NAME=cloudacademy-calc-pi
export LAMBDA_REGION=us-west-2
export IAM_ROLE_ARN=TOKEN_IAM_ROLE_ARN
export S3_BUCKET_NAME=TOKEN_S3_BUCKET_NAME

SHELL = bash

.DEFAULT_GOAL := all

libs: requirements.txt
@[ -d $@ ] || mkdir $@
pip3.10 install -r $< \
--platform manylinux2014_x86_64 \
--target=$@ \
--implementation cp \
--only-binary=:all: --upgrade

release.zip: libs lambda_function.py
zip -rq $@ *.py
cd $< && zip -rq ../$@ *

.PHONY: deploy
deploy: release.zip
aws lambda create-function \
--function-name "${LAMBDA_NAME}" \
--runtime python3.10 \
--timeout 60 \
--zip-file fileb://$< \
--handler lambda_function.lambda_handler \
--role "${IAM_ROLE_ARN}" \
--environment '{"Variables":{"S3_BUCKET_NAME":"${S3_BUCKET_NAME}"}}' \
--tracing-config 'Mode=Active' \
--region "${LAMBDA_REGION}" \
| jq -r ".State"
@echo "lambda function created..."
aws lambda wait function-active \
--function-name "${LAMBDA_NAME}" \
--region="${LAMBDA_REGION}"
@echo "lambda function is active..."
aws lambda create-function-url-config \
--function-name "${LAMBDA_NAME}" \
--auth-type "NONE" \
| jq -r ".FunctionUrl"
aws lambda add-permission \
--function-name "${LAMBDA_NAME}" \
--action lambda:InvokeFunctionUrl \
--principal "*" \
--statement-id "${LAMBDA_NAME}" \
--function-url-auth-type "NONE"
aws lambda wait function-updated \
--function-name "${LAMBDA_NAME}" \
--region="${LAMBDA_REGION}"
@echo "lambda function is ready..."

.PHONY: update
update: release.zip
aws lambda update-function-code \
--function-name "${LAMBDA_NAME}" \
--zip-file fileb://function.zip \
--zip-file fileb://$< \
--region="${LAMBDA_REGION}" \
| jq -r ".LastUpdateStatusReason"
aws lambda wait function-updated \
--function-name "${LAMBDA_NAME}" \
--region="${LAMBDA_REGION}"
@echo "lambda function updated..."

.PHONY: delete
delete:
-aws lambda delete-function-url-config \
--function-name "${LAMBDA_NAME}"
-aws lambda delete-function \
--function-name "${LAMBDA_NAME}"
@echo "lambda function is deleted..."

.PHONY: invoke
invoke:
aws lambda invoke \
--function-name "${LAMBDA_NAME}" \
--region="${LAMBDA_REGION}" \
--cli-binary-format raw-in-base64-out \
--payload '{"queryStringParameters": {"num": "1000"}}' \
--log-type Tail \
out \
| jq ".LogResult" -r | base64 -d

.PHONY: clean
clean:
rm release.zip

.PHONY: all
all: libs release.zip deploy invoke
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
boto3
aws_xray_sdk

0 comments on commit be0c1c7

Please sign in to comment.