Skip to content

feat: add python SDK examples and CLI tool for managing them #26

feat: add python SDK examples and CLI tool for managing them

feat: add python SDK examples and CLI tool for managing them #26

Workflow file for this run

name: Deploy Python Examples
on:
pull_request:
branches: [ "main", "development"]
paths:
- 'src/aws_durable_execution_sdk_python_testing/**'
- 'examples/**'
- '.github/workflows/deploy-examples.yml'
workflow_dispatch:
env:
AWS_REGION: us-west-2
permissions:
id-token: write
contents: read
jobs:
setup:
runs-on: ubuntu-latest
outputs:
examples: ${{ steps.get-examples.outputs.examples }}
steps:
- uses: actions/checkout@v4
- name: Get examples from catalog
id: get-examples
working-directory: ./examples
run: |
echo "examples=$(jq -c '.examples | map(select(.integration == true))' examples-catalog.json)" >> $GITHUB_OUTPUT
integration-test:
needs: setup
runs-on: ubuntu-latest
name: ${{ matrix.example.name }}
strategy:
matrix:
example: ${{ fromJson(needs.setup.outputs.examples) }}
fail-fast: false
steps:
- uses: actions/checkout@v4
- name: Setup SSH Agent
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SDK_KEY }}
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.13'
- name: Configure AWS credentials
if: github.event_name != 'workflow_dispatch' || github.actor != 'nektos/act'
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: "${{ secrets.ACTIONS_INTEGRATION_ROLE_NAME }}"
role-session-name: pythonTestingLibraryGitHubIntegrationTest
aws-region: ${{ env.AWS_REGION }}
- name: Install custom Lambda model
run: |
aws configure add-model --service-model file://.github/model/lambda.json --service-name lambda
- name: Install Hatch
run: pip install hatch
- name: Build examples
run: hatch run examples:build
- name: Deploy Lambda function - ${{ matrix.example.name }}
env:
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
LAMBDA_ENDPOINT: ${{ secrets.LAMBDA_ENDPOINT }}
INVOKE_ACCOUNT_ID: ${{ secrets.INVOKE_ACCOUNT_ID }}
KMS_KEY_ARN: ${{ secrets.KMS_KEY_ARN }}
run: |
# Build function name
EXAMPLE_NAME_CLEAN=$(echo "${{ matrix.example.name }}" | sed 's/ //g')
if [ "${{ github.event_name }}" = "pull_request" ]; then
FUNCTION_NAME="${EXAMPLE_NAME_CLEAN}-Python-PR-${{ github.event.number }}"
else
FUNCTION_NAME="${EXAMPLE_NAME_CLEAN}-Python"
fi
echo "Deploying ${{ matrix.example.name }} as $FUNCTION_NAME"
hatch run examples:deploy "${{ matrix.example.name }}" --function-name "$FUNCTION_NAME"
# Store function name for later steps
echo "FUNCTION_NAME=$FUNCTION_NAME" >> $GITHUB_ENV
- name: Invoke Lambda function - ${{ matrix.example.name }}
env:
LAMBDA_ENDPOINT: ${{ secrets.LAMBDA_ENDPOINT }}
run: |
echo "Testing function: $FUNCTION_NAME"
aws lambda invoke \
--function-name "$FUNCTION_NAME" \
--cli-binary-format raw-in-base64-out \
--payload '{"name": "World"}' \
--region "${{ env.AWS_REGION }}" \
--endpoint-url "$LAMBDA_ENDPOINT" \
/tmp/response.json \
> /tmp/invoke_response.json
echo "Response:"
cat /tmp/response.json
echo "Full Invoke Response:"
cat /tmp/invoke_response.json
echo "All Response Headers:"
jq -r '.ResponseMetadata.HTTPHeaders' /tmp/invoke_response.json || echo "No HTTPHeaders found"
# Extract invocation ID from response headers
INVOCATION_ID=$(jq -r '.ResponseMetadata.HTTPHeaders["x-amzn-invocation-id"] // empty' /tmp/invoke_response.json)
if [ -n "$INVOCATION_ID" ]; then
echo "INVOCATION_ID=$INVOCATION_ID" >> $GITHUB_ENV
echo "Captured Invocation ID: $INVOCATION_ID"
else
echo "Warning: Could not capture invocation ID from response"
fi
- name: Find Durable Execution - ${{ matrix.example.name }}
env:
LAMBDA_ENDPOINT: ${{ secrets.LAMBDA_ENDPOINT }}
run: |
echo "Listing durable executions for function: $FUNCTION_NAME"
aws lambda list-durable-executions \
--function-name "$FUNCTION_NAME" \
--region "${{ env.AWS_REGION }}" \
--endpoint-url "$LAMBDA_ENDPOINT" \
--cli-binary-format raw-in-base64-out \
--status-filter SUCCEEDED \
> /tmp/executions.json
echo "Durable Executions:"
cat /tmp/executions.json
# Extract the first execution ARN for history retrieval
EXECUTION_ARN=$(jq -r '.DurableExecutions[0].DurableExecutionArn // empty' /tmp/executions.json)
echo "EXECUTION_ARN=$EXECUTION_ARN" >> $GITHUB_ENV
- name: Get Durable Execution History - ${{ matrix.example.name }}
if: env.EXECUTION_ARN != ''
env:
LAMBDA_ENDPOINT: ${{ secrets.LAMBDA_ENDPOINT }}
run: |
echo "Getting execution history for: $EXECUTION_ARN"
aws lambda get-durable-execution-history \
--durable-execution-arn "$EXECUTION_ARN" \
--region "${{ env.AWS_REGION }}" \
--endpoint-url "$LAMBDA_ENDPOINT" \
--cli-binary-format raw-in-base64-out \
> /tmp/history.json
echo "Execution History:"
cat /tmp/history.json
# - name: Cleanup Lambda function
# if: always()
# env:
# LAMBDA_ENDPOINT: ${{ secrets.LAMBDA_ENDPOINT }}
# run: |
# echo "Deleting function: $FUNCTION_NAME"
# aws lambda delete-function \
# --function-name "$FUNCTION_NAME" \
# --endpoint-url "$LAMBDA_ENDPOINT" \
# --region "${{ env.AWS_REGION }}" || echo "Function already deleted or doesn't exist"