Skip to content

Add AWS CDK examples for creating and using a layer from the Serverless Application Repository #355

Closed
@austoonz

Description

@austoonz

What were you initially searching for in the docs?
Using the AWS CDK, I wanted to deploy a Lambda layer from the Powertools Serverless Application Repository ARN for re-use within my CDK application.

The Lambda Layer documentation does not include how to do this.

Is this related to an existing part of the documentation? Please share a link
https://awslabs.github.io/aws-lambda-powertools-python/#lambda-layer

Describe how we could make it clearer
A code snippet and details could be provided to make it easier for a customer to get up and running faster.

If you have a proposed update, please share it here

Using similar language to the existing documentation, but some rewording could also used to provide the overall detail with SAM and CDK examples below it.

If using the AWS CDK, you can create include this SAR App and lock to a specific semantic version. The Layer can be used in the same CDK application. Once deployed, it'll be available across the account this is deployed to.

** insert a TypeScript CDK example **

# Create the AWS Lambda Powertools for Python layer
powertools_arn = 'arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer'
powertools_application = aws_sam.CfnApplication(self, 'AWSLambdaPowertoolsApplication',
                                                location={'applicationId': powertools_arn,
                                                          'semanticVersion': '1.12.0'})
powertools_resource = cdk.CfnResource(powertools_application, 'AWSLambdaPowertoolsResource',
                                      type='AWS::Serverless::Application',
                                      properties={'Location': {
                                          'ApplicationId': powertools_arn,
                                          'SemanticVersion': '1.12.0'
                                      }})
powertools_layer = aws_lambda.LayerVersion.from_layer_version_arn(
    self, 'AWSLambdaPowertoolsLayer', powertools_resource.get_att("Outputs.LayerVersionArn").to_string())

# Reference the Layer in a Lambda definition
my_function = aws_lambda.Function(
    self, "MyFunction",
    layers=[powertools_layer],
    runtime=aws_lambda.Runtime.PYTHON_3_8,
)

Activity

self-assigned this
on Mar 23, 2021
michaelbrewer

michaelbrewer commented on Mar 23, 2021

@michaelbrewer
Contributor

Possibly a Python CDK example :P

austoonz

austoonz commented on Mar 23, 2021

@austoonz
Author

The example I included was Python CDK. 😁

ran-isenberg

ran-isenberg commented on Mar 25, 2021

@ran-isenberg
Contributor

+1 for this, was on my todo list for a long time ;)

ran-isenberg

ran-isenberg commented on Mar 25, 2021

@ran-isenberg
Contributor

is there a way to always get the latest published version?

am29d

am29d commented on Mar 25, 2021

@am29d
Contributor

Hi Andrew,

Thanks for opening the issue and providing the sample code. I will find a good spot in the docs to add it.

am29d

am29d commented on Mar 25, 2021

@am29d
Contributor

is there a way to always get the latest published version?

sadly no, you would need to run CLI or some custom resource to fetch it and sort by version

added this to the 1.14.0 milestone on Mar 29, 2021
michaelbrewer

michaelbrewer commented on Mar 30, 2021

@michaelbrewer
Contributor

is there a way to always get the latest published version?

sadly no, you would need to run CLI or some custom resource to fetch it and sort by version

For CDK, I like to load that kind of thing via configuration settings.

ran-isenberg

ran-isenberg commented on Mar 31, 2021

@ran-isenberg
Contributor

is there a way to always get the latest published version?

sadly no, you would need to run CLI or some custom resource to fetch it and sort by version

For CDK, I like to load that kind of thing via configuration settings.

I will need to write a function that takes the powertools version from my pipfile.lock file and set the layer version parameter. annoying, but will work.

michaelbrewer

michaelbrewer commented on Mar 31, 2021

@michaelbrewer
Contributor

@risenberg-cyberark for docs i would just use the cdk.json or runtime context to configure the version of powertools.

michaelbrewer

michaelbrewer commented on Apr 3, 2021

@michaelbrewer
Contributor

@risenberg-cyberark @austoonz here is a full working example using Poetry:

Directory structure like below, with cdk folder for the AWS CDK code and hello-world with the lambda code.

.
├── cdk
│   ├── Makefile
│   ├── README.md
│   ├── app.py
│   ├── cdk.json
│   ├── lambda_stack
│   │   ├── __init__.py
│   │   └── lambda_stack.py
│   ├── poetry.lock
│   └── pyproject.toml
└── hello-world
    └── app.py

Source for: cdk/pyproject.toml

[tool.poetry]
name = "cdk"
version = "0.1.0"
description = "CDK code for the hello world example"
authors = ["Michael Brewer <michael.brewer@gyft.com>"]

[tool.poetry.dependencies]
python = "^3.8"
"aws-cdk.core" = "^1.96.0"
"aws-cdk.aws-sam" = "^1.96.0"
"aws-cdk.aws-lambda" = "^1.96.0"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Source code for cdk/Makefile:

dev:
	pip install --upgrade pip poetry
	poetry install

Source code for the cdk/cdk.json:

{
  "app": "poetry run python3 app.py",
  "context": {
    "powertools_version": "1.13.0"
  }
}

Source code for the main stack cdk/lambda_stack/lambda_stack.py:

import pathlib

import aws_cdk.aws_lambda as aws_lambda
import aws_cdk.aws_sam as sam
from aws_cdk import core as cdk


class LambdaStack(cdk.Stack):
    def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        lambda_src_dir = str(pathlib.Path(__file__).parent.parent.parent) + "/hello-world/"

        # Reference the Layer in a Lambda definition
        aws_lambda.Function(
            self,
            "MyFunction",
            layers=[self.get_powertools_lambda_layer()],
            runtime=aws_lambda.Runtime.PYTHON_3_8,
            handler="app.lambda_handler",
            code=aws_lambda.Code.from_asset(lambda_src_dir),
        )

    def get_powertools_lambda_layer(self):
        powertools_version = self.node.try_get_context("powertools_version")
        powertools_arn = "arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer"
        powertools_application = sam.CfnApplication(
            self,
            "AWSLambdaPowertoolsApplication",
            location={
                "applicationId": powertools_arn,
                "semanticVersion": powertools_version,
            },
        )
        powertools_resource = cdk.CfnResource(
            powertools_application,
            "AWSLambdaPowertoolsResource",
            type="AWS::Serverless::Application",
            properties={
                "Location": {
                    "ApplicationId": powertools_arn,
                    "SemanticVersion": powertools_version,
                }
            },
        )
        return aws_lambda.LayerVersion.from_layer_version_arn(
            self,
            "AWSLambdaPowertoolsLayer",
            powertools_resource.get_att("Outputs.LayerVersionArn").to_string(),
        )
michaelbrewer

michaelbrewer commented on Apr 3, 2021

@michaelbrewer
Contributor

@heitorlessa @am29d ☝🏼 what do you think?

ran-isenberg

ran-isenberg commented on Apr 5, 2021

@ran-isenberg
Contributor

@michaelbrewer i got the same code in my project but we are using pipenv instead. I'm working on adding a code that will extract the powertools version from the pipenv.lock file and use that for the layer version is the cdk. that way when you upgrade your layer locally, it will also be used automatically for uploaded lambdas layer.

19 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Type

    No type

    Projects

    Status

    Triage

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @austoonz@am29d@heitorlessa@michaelbrewer@ran-isenberg

        Issue actions

          Add AWS CDK examples for creating and using a layer from the Serverless Application Repository · Issue #355 · aws-powertools/powertools-lambda-python