-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
4a3e5ef
commit be0c1c7
Showing
4 changed files
with
190 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
package | ||
*.zip |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
boto3 | ||
aws_xray_sdk |