Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(layers): add support for publishing v2 layer #1558

Merged
merged 36 commits into from
Oct 7, 2022
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
741b87a
feat(layers): add initial support for publishing v2 beta layer
rubenfonseca Sep 29, 2022
b850cf1
chore(layer): rename workflow
rubenfonseca Sep 29, 2022
3294d88
chore(deps): moved extra dependencies into an extra poetry group
rubenfonseca Sep 30, 2022
57be7ee
feat(layers): add regular and arm64 flavours
rubenfonseca Sep 30, 2022
c141cdc
chore(deps): move fastjsonschema to optinal dependency group
rubenfonseca Sep 30, 2022
0ba4d38
feat(layers): use qmeu for arm64 builds
rubenfonseca Sep 30, 2022
55e7e2d
fix(layers): pinned github actions
rubenfonseca Sep 30, 2022
ec4f5e6
chore: create extra dependency groups per utility
rubenfonseca Oct 3, 2022
43bc98f
chore: apply suggestions from code review
rubenfonseca Oct 3, 2022
0d19a80
chore: use latest cdk layer construct
rubenfonseca Oct 3, 2022
04f44b9
chore: add jmespath and idempotency deps groups
rubenfonseca Oct 3, 2022
bef044e
chore: lock deps
rubenfonseca Oct 3, 2022
273be4c
chore: use new cdk construct name
rubenfonseca Oct 3, 2022
c5d2669
chore: update call to CDK architecture
rubenfonseca Oct 3, 2022
c5b1df8
chore: fix canary deployment
rubenfonseca Oct 4, 2022
2c3b64c
feat: use canary to test for presence of optional dependencies
rubenfonseca Oct 5, 2022
41f8d4e
chore: bump cdk to 2.44 so we can use direct mode
rubenfonseca Oct 5, 2022
db227e2
chore: typo
rubenfonseca Oct 5, 2022
1c7b4fe
feat: use CDK direct mode on e2e and remove unecessary deps
rubenfonseca Oct 5, 2022
84eb4b5
chore: remove badly escaped strings
rubenfonseca Oct 5, 2022
f0093a4
chore: apply suggestions from code review
rubenfonseca Oct 6, 2022
7a45c12
chore: apply suggestions from code review
rubenfonseca Oct 6, 2022
5dd961a
chore: lock dependencies
rubenfonseca Oct 6, 2022
4ad4b5e
chore: apply suggestions from code review
rubenfonseca Oct 6, 2022
2c057a4
chore: remove unecessary code
rubenfonseca Oct 6, 2022
36fff2f
feat: allow e2e tests to run on arm64
rubenfonseca Oct 6, 2022
4eef6bd
chore: add jmespath as an optional dependency
rubenfonseca Oct 6, 2022
c8ecdb4
chore: bumped layer construct version
rubenfonseca Oct 6, 2022
683784f
chore(dep): add boto as optional dep
heitorlessa Oct 7, 2022
b7c0780
chore(dep): add aws-sdk extras to ease local dev
heitorlessa Oct 7, 2022
f61f03a
chore(typing): remove unnecessary optional type
heitorlessa Oct 7, 2022
8b4447c
chore(typing): remove unnecessary optional type
heitorlessa Oct 7, 2022
978cba4
refactor: use more explicit name for intent
heitorlessa Oct 7, 2022
3286573
chore: use more explicit name
heitorlessa Oct 7, 2022
9be0000
chore: lock dependencies
rubenfonseca Oct 7, 2022
2c56344
chore: update cdk construct dependency
rubenfonseca Oct 7, 2022
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
91 changes: 91 additions & 0 deletions .github/workflows/publish_v2_layer.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Deploy v2 layer to all regions

permissions:
id-token: write
contents: read

on:
workflow_dispatch:
inputs:
latest_published_version:
description: "Latest PyPi published version to rebuild latest docs for, e.g. v1.22.0"
rubenfonseca marked this conversation as resolved.
Show resolved Hide resolved
default: "v2.0.0"
required: true
# workflow_run:
# workflows: ["Publish to PyPi"]
# types:
# - completed

jobs:
build-layer:
runs-on: ubuntu-latest
if: ${{ (github.event.workflow_run.conclusion == 'success') || (github.event_name == 'workflow_dispatch') }}
defaults:
run:
working-directory: ./layer
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Install poetry
run: pipx install poetry
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "16.12"
- name: Setup python
uses: actions/setup-python@v4
with:
python-version: "3.9"
cache: "pip"
- name: Resolve and install project dependencies
# CDK spawns system python when compiling stack
# therefore it ignores both activated virtual env and cached interpreter by GH
run: |
poetry export --format requirements.txt --output requirements.txt
pip install -r requirements.txt
- name: Set release notes tag
run: |
RELEASE_INPUT=${{ inputs.latest_published_version }}
LATEST_TAG=$(git describe --tag --abbrev=0)
RELEASE_TAG_VERSION=${RELEASE_INPUT:-$LATEST_TAG}
echo RELEASE_TAG_VERSION="${RELEASE_TAG_VERSION:1}" >> "$GITHUB_ENV"
- name: Set up QEMU
uses: docker/setup-qemu-action@8b122486cedac8393e77aa9734c3528886e4a1a8 # v2.0.0
- name: Set up Docker Buildx
rubenfonseca marked this conversation as resolved.
Show resolved Hide resolved
id: builder
uses: docker/setup-buildx-action@dc7b9719a96d48369863986a06765841d7ea23f6 # v2.0.0
- name: install cdk and deps
run: |
npm install -g aws-cdk@2.44.0
cdk --version
- name: CDK build
run: cdk synth --context version="$RELEASE_TAG_VERSION" -o cdk.out
- name: zip output
run: zip -r cdk.out.zip cdk.out
- name: Archive CDK artifacts
uses: actions/upload-artifact@v3
with:
name: cdk-layer-artefact
path: layer/cdk.out.zip

deploy-beta:
needs:
- build-layer
uses: ./.github/workflows/reusable_deploy_v2_layer_stack.yml
secrets: inherit
with:
stage: "BETA"
artefact-name: "cdk-layer-artefact"
environment: "layer-beta"

# deploy-prod:
rubenfonseca marked this conversation as resolved.
Show resolved Hide resolved
# needs:
# - deploy-beta
# uses: ./.github/workflows/reusable_deploy_layer_stack.yml
# secrets: inherit
# with:
# stage: "PROD"
# artefact-name: "cdk-layer-artefact"
# environment: "layer-prod"
102 changes: 102 additions & 0 deletions .github/workflows/reusable_deploy_v2_layer_stack.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
name: Deploy CDK Layer v2 stack

permissions:
id-token: write
contents: read

rubenfonseca marked this conversation as resolved.
Show resolved Hide resolved
env:
CDK_VERSION: 2.44.0

on:
workflow_call:
inputs:
stage:
description: "Deployment stage (BETA, PROD)"
required: true
type: string
artefact-name:
description: "CDK Layer Artefact name to download"
required: true
type: string
environment:
description: "GitHub Environment to use for encrypted secrets"
required: true
type: string

jobs:
deploy-cdk-stack:
runs-on: ubuntu-latest
environment: ${{ inputs.environment }}
defaults:
run:
working-directory: ./layer
strategy:
fail-fast: false
matrix:
region:
rubenfonseca marked this conversation as resolved.
Show resolved Hide resolved
[
"af-south-1",
"eu-central-1",
"us-east-1",
"us-east-2",
"us-west-1",
"us-west-2",
"ap-east-1",
"ap-south-1",
"ap-northeast-1",
"ap-northeast-2",
"ap-southeast-1",
"ap-southeast-2",
"ca-central-1",
"eu-west-1",
"eu-west-2",
"eu-west-3",
"eu-south-1",
"eu-north-1",
"sa-east-1",
"ap-southeast-3",
"ap-northeast-3",
"me-south-1",
]
steps:
- name: checkout
uses: actions/checkout@v3
- name: Install poetry
run: pipx install poetry
- name: aws credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ matrix.region }}
role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }}
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "16.12"
- name: Setup python
uses: actions/setup-python@v4
with:
python-version: "3.9"
cache: "pip"
- name: Resolve and install project dependencies
# CDK spawns system python when compiling stack
# therefore it ignores both activated virtual env and cached interpreter by GH
run: |
poetry export --format requirements.txt --output requirements.txt
pip install -r requirements.txt
- name: install cdk and deps
run: |
npm install -g "aws-cdk@$CDK_VERSION"
cdk --version
- name: install deps
run: poetry install
- name: Download artifact
uses: actions/download-artifact@v3
with:
name: ${{ inputs.artefact-name }}
path: layer
- name: unzip artefact
run: unzip cdk.out.zip
- name: CDK Deploy Layer
run: cdk deploy --app cdk.out --context region=${{ matrix.region }} 'LayerStack' --require-approval never --verbose
- name: CDK Deploy Canary
run: cdk deploy --app cdk.out --context region=${{ matrix.region}} --parameters DeployStage="${{ inputs.stage }}" 'CanaryStack' --require-approval never --verbose
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ target:

dev:
pip install --upgrade pip pre-commit poetry
poetry install --extras "pydantic"
poetry install --extras "all"
pre-commit install

dev-gitpod:
pip install --upgrade pip poetry
poetry install --extras "pydantic"
poetry install --extras "all"
pre-commit install

format:
Expand Down
5 changes: 4 additions & 1 deletion layer/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
app = cdk.App()

POWERTOOLS_VERSION: str = app.node.try_get_context("version")
SSM_PARAM_LAYER_ARN: str = "/layers/powertools-layer-arn"
SSM_PARAM_LAYER_ARN: str = "/layers/powertools-layer-v2-arn"
SSM_PARAM_LAYER_ARM64_ARN: str = "/layers/powertools-layer-v2-arm64-arn"

if not POWERTOOLS_VERSION:
raise ValueError(
Expand All @@ -21,13 +22,15 @@
"LayerStack",
powertools_version=POWERTOOLS_VERSION,
ssm_paramter_layer_arn=SSM_PARAM_LAYER_ARN,
ssm_parameter_layer_arm64_arn=SSM_PARAM_LAYER_ARM64_ARN,
)

CanaryStack(
app,
"CanaryStack",
powertools_version=POWERTOOLS_VERSION,
ssm_paramter_layer_arn=SSM_PARAM_LAYER_ARN,
ssm_parameter_layer_arm64_arn=SSM_PARAM_LAYER_ARM64_ARN,
)

app.synth()
32 changes: 30 additions & 2 deletions layer/layer/canary/app.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
import datetime
import json
import os
import platform
from importlib.metadata import version

import boto3
from pydantic import EmailStr

from aws_lambda_powertools import Logger, Metrics, Tracer
from aws_lambda_powertools.utilities.parser import BaseModel, envelopes, event_parser
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools.utilities.validation import validator

logger = Logger(service="version-track")
tracer = Tracer()
tracer = Tracer() # this checks for aws-xray-sdk presence
metrics = Metrics(namespace="powertools-layer-canary", service="PowertoolsLayerCanary")

layer_arn = os.getenv("POWERTOOLS_LAYER_ARN")
Expand All @@ -17,6 +22,26 @@
event_bus_arn = os.getenv("VERSION_TRACKING_EVENT_BUS_ARN")


# Model to check parser imports correctly, tests for pydantic and email-validator
class OrderItem(BaseModel):
order_id: int
quantity: int
description: str
email: EmailStr


# Tests for jmespath presence
@event_parser(model=OrderItem, envelope=envelopes.EventBridgeEnvelope)
def envelope_handler(event: OrderItem, context: LambdaContext):
assert event.order_id != 1


# Tests for fastjsonschema presence
@validator(inbound_schema={}, envelope="detail")
def validator_handler(event, context: LambdaContext):
pass


rubenfonseca marked this conversation as resolved.
Show resolved Hide resolved
def handler(event):
logger.info("Running checks")
check_envs()
Expand Down Expand Up @@ -66,7 +91,7 @@ def verify_powertools_version() -> None:
current_version = version("aws_lambda_powertools")
if powertools_version != current_version:
raise ValueError(
f'Expected powertoosl version is "{powertools_version}", but layer contains version "{current_version}"'
f'Expected Powertools version is "{powertools_version}", but layer contains version "{current_version}"'
rubenfonseca marked this conversation as resolved.
Show resolved Hide resolved
)
logger.info(f"Current Powertools version is: {current_version}")

Expand All @@ -80,6 +105,8 @@ def send_notification():
"Not sending notification to event bus, because this is not the PROD stage"
)
return

architecture = platform.uname()[4]
rubenfonseca marked this conversation as resolved.
Show resolved Hide resolved
event = {
"Time": datetime.datetime.now(),
"Source": "powertools.layer.canary",
Expand All @@ -90,6 +117,7 @@ def send_notification():
"version": powertools_version,
"region": os.environ["AWS_REGION"],
"layerArn": layer_arn,
"architecture": architecture,
rubenfonseca marked this conversation as resolved.
Show resolved Hide resolved
}
),
}
Expand Down
Loading