Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
d81bada
feat: update code to be compatible with AWS Lambda
askorupka May 7, 2026
7693b8c
feat: login to AWS
askorupka May 14, 2026
80dc788
chore: fix formatting
askorupka May 14, 2026
705cab1
feat: add prepare lambda package step
askorupka May 21, 2026
b629ca8
chore: checkout the code
askorupka May 21, 2026
f11587a
feat: deploy Lambda
askorupka May 21, 2026
d670077
feat: add multiply
askorupka May 21, 2026
9ec1505
fix: update lambda_handler to handle JSON input and outputfix
askorupka Jun 4, 2026
2d3aef4
chore: upgrade checkout step version
askorupka Jun 4, 2026
0823fc8
chore: upgrade setup-python
askorupka Jun 4, 2026
1a97d91
fix: create lambda function
askorupka Jun 4, 2026
434c9d7
fix: add mandatory parameters
askorupka Jun 4, 2026
eb3bcc1
feat: add multiply support
askorupka Jun 4, 2026
124ac91
fix: create/update lambda function conditionally
askorupka Jun 4, 2026
f8cd10c
fix: update function code to support both curl and AWS console test
askorupka Jun 11, 2026
a1943af
chore: test Lambda URL creation
askorupka Jun 11, 2026
e1511d3
fix: update code
askorupka Jun 11, 2026
a5b2627
fix: add more permissions to lambda function
askorupka Jun 11, 2026
498803b
fix: add more permissions to lambda function
askorupka Jun 11, 2026
c4a39ec
fix: add more permissions to lambda function
askorupka Jun 11, 2026
dd0660c
fix: add more permissions to lambda function
askorupka Jun 11, 2026
aaed678
fix: add more permissions to lambda function
askorupka Jun 11, 2026
53295c2
fix: add more permissions to lambda function
askorupka Jun 11, 2026
1afc26c
fix: add more permissions to lambda function
askorupka Jun 11, 2026
97c953e
chore: cleanup code
askorupka Jun 11, 2026
4e5cef2
chore: prepare code for the class
askorupka Jun 11, 2026
7336b7c
fix: fix types of a and b
askorupka Jun 11, 2026
43f5cc9
feat: add new operations
askorupka Jun 18, 2026
aaaf719
feat: add function URL
askorupka Jun 24, 2026
3310776
fix: create URL only when it doesn't exist
askorupka Jun 24, 2026
b15a02f
chore: parametrize LAMBDA_NAME
askorupka Jun 24, 2026
753afc4
fix: add resource-based policy
askorupka Jul 2, 2026
2305cfc
fix: add resource-based policy
askorupka Jul 2, 2026
16d2444
fix: clean up space at the end of the line
askorupka Jul 9, 2026
f3e3da8
feat: add power operation
askorupka Jul 9, 2026
80d06b8
chore: change trigger for GHA
askorupka Jul 9, 2026
5e981ee
Merge branch 'main' into 20260507_lambda
askorupka Jul 9, 2026
4e62931
fix: newline at the end of the file
askorupka Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 91 additions & 3 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ jobs:
steps:

- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6

- name: Setup python
uses: actions/setup-python@v4
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}

Expand All @@ -37,4 +37,92 @@ jobs:
run: pytest

- name: Run linter
run: flake8 .
run: flake8 .

deploy:
runs-on: ubuntu-latest

defaults:
run:
working-directory: 01-ci-lab

permissions:
id-token: write

needs: test

env:
LAMBDA_NAME: calculator-app

steps:

- name: Checkout repository
uses: actions/checkout@v6

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::350469506175:role/github-actions-lambda-deploy-role
aws-region: eu-central-1

- name: Prepare Lambda package
run: |
cp app/calculator.py lambda_function.py
zip function.zip lambda_function.py

- name: Create/update Lambda
run: |
if aws lambda get-function --function-name ${{ env.LAMBDA_NAME }} >/dev/null 2>&1; then

echo "${{ env.LAMBDA_NAME }} lambda exists"

aws lambda update-function-code \
--function-name ${{ env.LAMBDA_NAME }} \
--zip-file fileb://function.zip

else

echo "${{ env.LAMBDA_NAME }} lambda doesn't exist, creating"

aws lambda create-function \
--function-name ${{ env.LAMBDA_NAME }} \
--role arn:aws:iam::350469506175:role/service-role/calculator-app-role-cnpkrehb \
--runtime python3.13 \
--handler lambda_function.lambda_handler \
--zip-file fileb://function.zip

fi

- name: Create function URL
run: |
if ! aws lambda get-function-url-config \
--function-name ${{ env.LAMBDA_NAME }} >/dev/null 2>&1; then

echo "URL doesn't exist, creating"

aws lambda create-function-url-config \
--function-name ${{ env.LAMBDA_NAME }} \
--auth-type NONE

aws lambda add-permission \
--function-name ${{ env.LAMBDA_NAME }} \
--statement-id FunctionAllowPublicAccessUrl \
--action lambda:InvokeFunctionUrl \
--principal "*" \
--function-url-auth-type NONE

aws lambda add-permission \
--function-name ${{ env.LAMBDA_NAME }} \
--statement-id FunctionAllowPublicAccess \
--action lambda:InvokeFunction \
--principal "*" \
--invoked-via-function-url

else

echo "URL exists"

aws lambda get-function-url-config \
--function-name ${{ env.LAMBDA_NAME }}

fi
54 changes: 53 additions & 1 deletion 01-ci-lab/app/calculator.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,58 @@
import json


def add(a, b):
return a + b


def divide(a, b): #
def divide(a, b):
return a / b


def multiply(a, b):
return a * b


def substract(a, b):
return a - b


def power(a, b):
return a**b


def lambda_handler(event, context):
# Function URL / API Gateway
if "body" in event:
if isinstance(event["body"], str):
body = json.loads(event["body"])
else:
body = event["body"]
# Test from AWS Console
else:
body = event

a = float(body["a"])
b = float(body["b"])
operation = body["operation"]

if operation == "add":
result = add(a, b)
elif operation == "divide":
result = divide(a, b)
elif operation == "multiply":
result = multiply(a, b)
elif operation == "substract":
result = substract(a, b)
elif operation == "power":
result = power(a, b)
else:
return {
"statusCode": 400,
"body": json.dumps({"error": "Unsupported operation"})
}

return {
"statusCode": 200,
"body": json.dumps({"result": result})
}