DEV Community

Cover image for Quick Start Lambda Container Image Using AWS CDK 2.0
πŸš€ Vu Dao πŸš€
πŸš€ Vu Dao πŸš€

Posted on

Quick Start Lambda Container Image Using AWS CDK 2.0

- This post create a lambda function container image to send a message to Slack using IaC - AWS CDK 2.0, use this as a quick guide for your practice of those keywords.


What’s In This Document


πŸš€ Lambda function handler

  • You need a slack webhook url of the registered channel to send messages to
#!/usr/bin/env python
from datetime import datetime
import json
import requests


def handler(event, context):
    webhook_url = 'https://hooks.slack.com/services/WORKSPACE_ID/WEBHOOK_ID'
    footer_icon = 'https://static.io/img/cdk.png'
    color = '#36C5F0'
    level = ':white_check_mark: INFO :white_check_mark:'
    curr_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    message = event['msg']
    slack_payload = {"username": "From-Lambda-Image",
                     "attachments": [{"fallback": "Required plain-text summary of the attachment.",
                                      "pretext": level,
                                      "color": color,
                                      "text": message,
                                      "footer": curr_time,
                                      "footer_icon": footer_icon}]}
    requests.post(webhook_url, data=json.dumps(slack_payload), headers={'Content-Type': 'application/json'})
Enter fullscreen mode Exit fullscreen mode

πŸš€ Dockerfile base on AWS lambda image

  • Dockerfile should use aws-lambda-* as a base image in order to have lambda API
FROM amazon/aws-lambda-python:3.8

RUN yum -y update && \
    yum install -y python3-pip && \
    pip3 install requests

COPY app.py ./

CMD ["app.handler"]
Enter fullscreen mode Exit fullscreen mode

πŸš€ CDK stack

  • Stack will create
    • IAM role for writing cloudwatch log
    • Build image and then push to ECR
    • Lambda function container image
⚑ $ tree
.
β”œβ”€β”€ app.py
β”œβ”€β”€ docker_cdk
β”‚Β Β  β”œβ”€β”€ docker_cdk_stack.py
β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  └── __pycache__
β”‚Β Β      β”œβ”€β”€ docker_cdk_stack.cpython-38.pyc
β”‚Β Β      └── __init__.cpython-38.pyc
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ resource
β”‚Β Β  β”œβ”€β”€ app.py
β”‚Β Β  └── Dockerfile
β”œβ”€β”€ setup.py
└── source.bat
Enter fullscreen mode Exit fullscreen mode
from constructs import Construct
from aws_cdk import (
    Stack,
    aws_lambda as _lambda,
    aws_iam as iam
)
import os


class DockerCdkStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, env, **kwargs) -> None:
        super().__init__(scope, construct_id, env=env, **kwargs)

        policy_statement = iam.PolicyStatement(
            effect=iam.Effect.ALLOW,
            actions=[
                "logs:CreateLogStream",
                "logs:CreateLogGroup",
                "logs:PutLogEvents"
            ],
            resources=['arn:aws:logs:*:*:*'],
            conditions={'StringEquals': {"aws:RequestedRegion": "ap-northeast-2"}}
        )
        lambda_role = iam.Role(self, 'LambdaRole', assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
                               role_name='docker-cdk-role')
        lambda_role.add_to_policy(statement=policy_statement)
        lambda_image = _lambda.DockerImageFunction(
            self, 'DockerImageFunc',
            function_name='docker-aws-cdk',
            code=_lambda.DockerImageCode.from_image_asset(
                directory=f'{os.getcwd()}/resource', file='Dockerfile', exclude=['cdk.out'],
            ),
            role=lambda_role
        )
Enter fullscreen mode Exit fullscreen mode

πŸš€ Invoke lambda function

⚑ $ aws lambda invoke --function-name docker-aws-cdk --region ap-northeast-2 --payload '{"msg":"Hello"}' --cli-binary-format raw-in-base64-out outfile
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
⚑ $ aws lambda invoke --function-name docker-aws-cdk --region ap-northeast-2 --payload '{"msg":"How are you?"}' --cli-binary-format raw-in-base64-out outfile
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
Enter fullscreen mode Exit fullscreen mode

Alt-Text

🌠 Blog · Github · stackoverflow · Linkedin · Group · Page · Twitter 🌠

Top comments (0)