<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ken Choong</title>
    <description>The latest articles on DEV Community by Ken Choong (@upupkenchoong).</description>
    <link>https://dev.to/upupkenchoong</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F480169%2Fa54332b8-69ff-4a47-9721-68e3718b796d.jpg</url>
      <title>DEV Community: Ken Choong</title>
      <link>https://dev.to/upupkenchoong</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/upupkenchoong"/>
    <language>en</language>
    <item>
      <title>How to provision APIgateway StageVariables and Deployment using AWS CDK?</title>
      <dc:creator>Ken Choong</dc:creator>
      <pubDate>Sat, 08 May 2021 01:54:11 +0000</pubDate>
      <link>https://dev.to/upupkenchoong/how-to-provision-apigateway-stagevarible-and-deployment-using-aws-cdk-2f8k</link>
      <guid>https://dev.to/upupkenchoong/how-to-provision-apigateway-stagevarible-and-deployment-using-aws-cdk-2f8k</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/upupkenchoong/concept-to-use-apigateway-stagevariables-lambda-version-alias-environment-variable-all-together-h8j"&gt;previous post&lt;/a&gt;, you know all the basic concept about how APIGateway, Lambda, Lambda version, alias, environment work together. &lt;/p&gt;

&lt;p&gt;Now, we start provision the APIgateway using the CDK python. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/upupkenchoong/how-to-provision-lambda-and-lambda-layer-with-cdk-2ff4"&gt;In this post&lt;/a&gt;, we already learned that provision Lambda and Lambda Layer, so we will use back the code here, if you new here, just read the post, cause I mention a lot details about Lambda and Lambda Layer &lt;a href="https://dev.to/upupkenchoong/how-to-provision-lambda-and-lambda-layer-with-cdk-2ff4"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now your MySampleAppStack file look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_cdk.aws_lambda_python&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PythonFunction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PythonLayerVersion&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MySampleStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Construct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
           &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

           &lt;span class="c1"&gt;# All the aws resources define here
&lt;/span&gt;
            &lt;span class="c1"&gt;# Here define a Lambda Layer 
&lt;/span&gt;            &lt;span class="n"&gt;boto3_lambda_layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PythonLayerVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
               &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Boto3LambdaLayer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lambda/boto3Folder&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;compatible_runtimes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lambda_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PYTHON_3_8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
               &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Boto3 Library&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;layer_version_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Whatever name you want&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
           &lt;span class="p"&gt;)&lt;/span&gt;

          &lt;span class="n"&gt;my_first_lambda_function&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;PythonFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                 &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MyFirstLambda&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lambda/MyFirstLambdaFunction&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;app.py&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lambda_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PYTHON_3_8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;boto3_lambda_layer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
                 &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MyFirstLambdaHandler&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alright, the Lambda already done, continue from here, we provision our API first. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install aws_cdk.aws_apigateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This install all the necessary package. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/upupkenchoong/concept-to-use-apigateway-stagevariables-lambda-version-alias-environment-variable-all-together-h8j"&gt;As mention in this post&lt;/a&gt;, we need 2 API stage named&lt;code&gt;dev&lt;/code&gt; and &lt;code&gt;prod&lt;/code&gt;,&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dev&lt;/code&gt; is for us to develop and testing &lt;br&gt;
&lt;code&gt;prod&lt;/code&gt; is for our production user &lt;/p&gt;

&lt;p&gt;Then we need to set the StageVaribles for each API stage which is &lt;/p&gt;

&lt;p&gt;&lt;code&gt;dev&lt;/code&gt; stage have Stage Variables of &lt;code&gt;"lambdaAlias": "dev"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;prod&lt;/code&gt; stage have stage variables of &lt;code&gt;"lambdaAlias": "prod"&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;As you can see both API stage also have &lt;code&gt;lambdaAlias&lt;/code&gt;, just the value is different. Therefore we will use this value to differentiate the API call from frontend is either developer or production user.&lt;/p&gt;

&lt;p&gt;Again, I talk a lot of details &lt;a href="https://dev.to/upupkenchoong/concept-to-use-apigateway-stagevariables-lambda-version-alias-environment-variable-all-together-h8j"&gt;here&lt;/a&gt;, I strongly recommend you read it, this will help you better understand throughout the whole series. &lt;/p&gt;

&lt;p&gt;In order to achieve that, we do the code below, then I explain step by step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_cdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;aws_lambda&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;lambda_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aws_apigateway&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;apigateway&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;#add this
&lt;/span&gt;    &lt;span class="n"&gt;core&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MySampleStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Construct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
           &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

           &lt;span class="c1"&gt;# ... all the lambda code above 
&lt;/span&gt;
           &lt;span class="c1"&gt;# define a dev deployment
&lt;/span&gt;           &lt;span class="n"&gt;dev_deployment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apigateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StageOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="n"&gt;stage_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="n"&gt;variables&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lambdaAlias&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;# this is stage variable 
&lt;/span&gt;            &lt;span class="p"&gt;})&lt;/span&gt;

           &lt;span class="c1"&gt;# define an API 
&lt;/span&gt;           &lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apigateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LambdaRestApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
               &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MyAPI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# give it a name
&lt;/span&gt;               &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;my_first_lambda_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# the lambda above
&lt;/span&gt;               &lt;span class="n"&gt;deploy_options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dev_deployment&lt;/span&gt;
           &lt;span class="p"&gt;)&lt;/span&gt;

           &lt;span class="c1"&gt;#define a prod deployment
&lt;/span&gt;           &lt;span class="n"&gt;prod_deployment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apigateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Deployment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ProdDeployment08052021&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# change the date here
&lt;/span&gt;              &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="n"&gt;retain_deployments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="c1"&gt;# Change the description here as well for our reference
&lt;/span&gt;              &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Production API deployment as 08-05-2021 Live version&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

          &lt;span class="c1"&gt;# Production stage
&lt;/span&gt;          &lt;span class="n"&gt;prod_stage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apigateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Stage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ProdStage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prod_deployment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;stage_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;variables&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lambdaAlias&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
          &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Some explanation for our code above&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev deployment&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;dev_deployment&lt;/code&gt;: This is our dev deployment. We define a stage named &lt;code&gt;dev&lt;/code&gt; and the stage variable key value &lt;code&gt;"lambdaAlias": "dev"&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;api&lt;/code&gt; : This is our main API object, it will use &lt;code&gt;my_first_lambda_function&lt;/code&gt; that we define above as &lt;code&gt;handler&lt;/code&gt;. Means that, when this API endpoint is hit, it will trigger &lt;code&gt;my_first_lambda_function&lt;/code&gt; by default(Lambda is not specially set to a method). We specify &lt;code&gt;deploy_options&lt;/code&gt; to &lt;code&gt;dev_deployment&lt;/code&gt; which means everytime we deploy our CDK, it will only update the &lt;code&gt;dev&lt;/code&gt; stage and effect to &lt;code&gt;prod&lt;/code&gt; stage, which is what we want. In other words, &lt;code&gt;dev&lt;/code&gt; stage is the default stage of our API. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prod deployment&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;prod_deployment&lt;/code&gt; : This is our &lt;code&gt;prod&lt;/code&gt; stage deployment. The ID &lt;code&gt;ProdDeployment08052021&lt;/code&gt; in the code above, after we make sure everything is ok, and we like to push the stack the our production user, we change the date &lt;code&gt;08052021&lt;/code&gt;, by this, CDK will create a brand new deployment for all the code your define in your stack. &lt;/p&gt;

&lt;p&gt;Remember, we only want update &lt;code&gt;dev_deployment&lt;/code&gt; for testing, then everything ok then only push to production? &lt;/p&gt;

&lt;p&gt;This is exactly what we do, let's say we 3 new method to the API, at the meantime, we just testing in &lt;code&gt;dev_deployment&lt;/code&gt;, &lt;code&gt;prod_deployment&lt;/code&gt; is not effected. At 11-05-2021 we done all the testing, everything ok, is time to push to product, we change to &lt;code&gt;ProdDeployment11052021&lt;/code&gt;, this will create a new &lt;code&gt;deployment&lt;/code&gt; for all 3 method we defined before. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prod stage&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;prod_stage&lt;/code&gt;: This is the production stage of our API. All production user will hit this API stage. It will always use &lt;code&gt;prod_deployment&lt;/code&gt;, so everytime a new &lt;code&gt;prod_deployment&lt;/code&gt; created, it will use that. Therefore change the date in the ID, then new deployment is created, &lt;code&gt;prod_stage&lt;/code&gt; will use that. This is how we update our production API stage. &lt;/p&gt;

&lt;p&gt;All right, for now the basic of our API is completed. &lt;/p&gt;

&lt;p&gt;Now we can add some API method to our API. We can do it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ... continue with the code above
&lt;/span&gt;
&lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;store&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# GET /store
&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# POST /store
&lt;/span&gt;
&lt;span class="n"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;profile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# GET /profile
&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# POST /profile
&lt;/span&gt;
&lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# GET /product
&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DELETE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# DELETE /product
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alright, so now you have 3 API root, which is &lt;code&gt;store&lt;/code&gt;, &lt;code&gt;profile&lt;/code&gt; and &lt;code&gt;product&lt;/code&gt; with all the different CRUD method. &lt;/p&gt;

&lt;p&gt;For now, if you ok for all the method you defined, you should change the date in &lt;code&gt;ProdDeployment&amp;lt;Your date&amp;gt;&lt;/code&gt; and description in &lt;code&gt;prod_deployment&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For summarize:&lt;/strong&gt;&lt;br&gt;
In this tutorial, you learned about: &lt;br&gt;
1) How to create different API stage using CDK&lt;br&gt;
2) How to create different API deployment using CDK&lt;br&gt;
3) How to define stage variable for each API stage using CDK&lt;br&gt;
4) How to define API method using CDK &lt;/p&gt;

&lt;p&gt;I hope all this make sense to you. Have a good day. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;In next part of the series:&lt;/em&gt;&lt;br&gt;
For now, all this 3 API root(&lt;code&gt;store&lt;/code&gt;, &lt;code&gt;profile&lt;/code&gt; , &lt;code&gt;product&lt;/code&gt;), no matter what CRUD method, it also will only trigger &lt;code&gt;my_first_lambda_function&lt;/code&gt; that we define above.&lt;/p&gt;

&lt;p&gt;In next part, I will make different API root, will trigger different lambda function. This is called &lt;strong&gt;Lambda Integration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I also will tell how we can build our &lt;strong&gt;CDK Constructs&lt;/strong&gt;, what is it and why we should use it. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you go,&lt;/strong&gt; if you like this series or find this useful consider to buy me a coffee 😊🤞 for 5 USD or more. &lt;br&gt;
I will prepare a GitHub repo for this whole tutorial series and arrange into separate commit for each part. &lt;br&gt;
This will only available for my supporter cause I spent a lot of time to prepare this. Anyway, I appreciate you here. Have a good day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kenchoong" rel="noopener noreferrer"&gt;&lt;br&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fap0mog1ue623vr1zbo36.jpg" alt="bmaco"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shout out to me on Twitter: &lt;a href="https://twitter.com/upupkenchoong" rel="noopener noreferrer"&gt;@upupkenchoong&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>python</category>
      <category>cloudskills</category>
    </item>
    <item>
      <title>Concept for how to use ApiGateway StageVariables, Lambda Version, Alias, Environment variable, all together</title>
      <dc:creator>Ken Choong</dc:creator>
      <pubDate>Sun, 02 May 2021 09:56:28 +0000</pubDate>
      <link>https://dev.to/upupkenchoong/concept-to-use-apigateway-stagevariables-lambda-version-alias-environment-variable-all-together-h8j</link>
      <guid>https://dev.to/upupkenchoong/concept-to-use-apigateway-stagevariables-lambda-version-alias-environment-variable-all-together-h8j</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/upupkenchoong/how-to-set-environment-variable-for-lambda-using-cdk-4m36"&gt;previous part&lt;/a&gt;of this series, we know how to set &lt;code&gt;environment variables&lt;/code&gt; inside our Lambda. &lt;/p&gt;

&lt;p&gt;In this part, I will talk about how we can use Apigateway StageVariables, Lambda Version, Alias, Environment variable all together. &lt;/p&gt;

&lt;p&gt;We have to understand how the whole process work first, then only we can create this easily using CDK code. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's imagine this scenario&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have an API that will use Lambda function&lt;/li&gt;
&lt;li&gt;You make a Lambda function&lt;/li&gt;
&lt;li&gt;This function will in production which used by real world user &lt;/li&gt;
&lt;li&gt;But you also want to edit this Lambda or continuously develop new stuff for this Lambda &lt;/li&gt;
&lt;li&gt;Now what if you have some error when editing the Lambda code? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then this will effect you Real world user right? The app will crash, then user leave, give you some nasty feedback. &lt;br&gt;
NO GOOD! &lt;br&gt;
Can you imagine how painful and stressful when developing stuff like this? &lt;/p&gt;

&lt;p&gt;Then this is why Lambda Version and Alias come in handy. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How &lt;code&gt;Lambda version&lt;/code&gt; work?&lt;/strong&gt;&lt;br&gt;
Imagine this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You make a Lambda function&lt;/li&gt;
&lt;li&gt;By default, every Lambda function have a &lt;code&gt;$Latest&lt;/code&gt; version, this is where you keep editing/developing your code, this only use by you. &lt;/li&gt;
&lt;li&gt;When everything ok, you publish a new &lt;code&gt;Version&lt;/code&gt; for the function, let say &lt;code&gt;version:1&lt;/code&gt;. The real world user will access to this &lt;code&gt;version:1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We will keep repeating the process which is edit code in &lt;code&gt;$Latest&lt;/code&gt;, publish a new &lt;code&gt;version&lt;/code&gt; every time when everything ok for production. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By doing this, you keep editing code in &lt;code&gt;$Latest&lt;/code&gt;, any changes in &lt;code&gt;$Latest&lt;/code&gt; will not affect to &lt;code&gt;version:1&lt;/code&gt;, so any error will not annoy your real world user. &lt;/p&gt;

&lt;p&gt;Now you have 2 &lt;code&gt;version&lt;/code&gt; for your Lambda, &lt;code&gt;$Latest&lt;/code&gt; and &lt;code&gt;version:1&lt;/code&gt;, then how we can set the production user will access &lt;code&gt;version:1&lt;/code&gt; and developer(us) will access &lt;code&gt;$Latest&lt;/code&gt;? &lt;/p&gt;

&lt;p&gt;This is why &lt;code&gt;Lambda Alias&lt;/code&gt; come in handy. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The process of &lt;code&gt;alias&lt;/code&gt; and &lt;code&gt;version&lt;/code&gt; look like this:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now we need to create 2 &lt;code&gt;alias&lt;/code&gt; for our Lambda named &lt;code&gt;dev&lt;/code&gt; and &lt;code&gt;prod&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dev&lt;/code&gt; alias -&amp;gt; point to -&amp;gt; &lt;code&gt;$Latest&lt;/code&gt; version &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prod&lt;/code&gt; alias -&amp;gt; point to -&amp;gt; &lt;code&gt;version:1&lt;/code&gt;(or 2,3,4,5, depends)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alias is done, but now your frontend application still don't know which Lambda &lt;code&gt;version&lt;/code&gt; to access. &lt;/p&gt;

&lt;p&gt;This is why APIGateway &lt;code&gt;StageVariables&lt;/code&gt; come in play. &lt;/p&gt;

&lt;p&gt;Now we can create 2 &lt;code&gt;Stage&lt;/code&gt; for your API named &lt;code&gt;dev&lt;/code&gt; and &lt;code&gt;prod&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will give us 2 URL which look like this: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; https://{APP-ID}.execute-api.{aws-region}.amazonaws.com/dev&lt;/li&gt;
&lt;li&gt; https://{APP-ID}.execute-api.{aws-region}.amazonaws.com/prod&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now set a &lt;code&gt;Stage Variables&lt;/code&gt; for each API stage like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dev&lt;/code&gt; stage: &lt;code&gt;lambdaAlias:dev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prod&lt;/code&gt; stage: &lt;code&gt;lambdaAlias:prod&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then the whole process will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API dev stage -&amp;gt; Lambda dev alias -&amp;gt; Lambda `$Latest` version

API prod stage -&amp;gt; Lambda prod alias -&amp;gt; Lambda `version:1`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inside the Lambda function we get back the &lt;code&gt;StageVariables&lt;/code&gt; and use it with the &lt;code&gt;environment variables&lt;/code&gt; that we set in &lt;a href="https://dev.to/upupkenchoong/how-to-set-environment-variable-for-lambda-using-cdk-4m36"&gt;previous part&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;MyFirstLambdaHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dynamodb&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Get the stageVariable lambdaAlias
&lt;/span&gt;    &lt;span class="n"&gt;stage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stageVariables&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lambdaAlias&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Get the environment variable depends on stage variable
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;stage&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;tableName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;production_db_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;stage&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dev&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;tableName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;development_db_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Then here you can access different table depends on environment
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we connecting the dots:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API dev -&amp;gt; Lambda dev alias -&amp;gt; Lambda version:$Latest -&amp;gt; environment variables 

API prod -&amp;gt; Lambda prod alias -&amp;gt; Lambda version:1 -&amp;gt; environment variables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For summary:&lt;/strong&gt;&lt;br&gt;
TLDR, everything in development stay in development, which wont affect anything in production. &lt;/p&gt;

&lt;p&gt;Now you have some basic concept for Lambda &lt;code&gt;Version&lt;/code&gt;, &lt;code&gt;Alias&lt;/code&gt;, APIGateway &lt;code&gt;stage variables&lt;/code&gt; and environment variables. &lt;/p&gt;

&lt;p&gt;You now know how to continuously develop your Lambda, but at the same time wont fu**ked up your whole production app when some error happened when developing. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In next part of the series, I will talk about:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to create Lambda Version using CDK&lt;/li&gt;
&lt;li&gt;How to create Lambda Alias and hit different Lambda Version using CDK &lt;/li&gt;
&lt;li&gt;How to create different Deployment stage of API gateway and set stage variables using CDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In case you cant wait that long, here is my previous work on this topic: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/upupkenchoong/comment/1b7f0"&gt;A dev.to comment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/a/66844497/4332049" rel="noopener noreferrer"&gt;SO question I answer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Before you go,&lt;/strong&gt; if you like this series or find this useful consider to buy me a coffee 😊🤞 for 5 USD or more. &lt;br&gt;
I will prepare a GitHub repo for this whole tutorial series and arrange into separate commit for each part. &lt;br&gt;
This will only available for my supporter cause I spent a lot of time to prepare this. Anyway, I appreciate you here. Have a good day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kenchoong" rel="noopener noreferrer"&gt;&lt;br&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fap0mog1ue623vr1zbo36.jpg" alt="bmaco"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shout out to me on Twitter: &lt;a href="https://twitter.com/upupkenchoong" rel="noopener noreferrer"&gt;@upupkenchoong&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cdk</category>
      <category>serverless</category>
      <category>python</category>
    </item>
    <item>
      <title>How to set environment variable for Lambda using CDK</title>
      <dc:creator>Ken Choong</dc:creator>
      <pubDate>Sat, 01 May 2021 21:46:02 +0000</pubDate>
      <link>https://dev.to/upupkenchoong/how-to-set-environment-variable-for-lambda-using-cdk-4m36</link>
      <guid>https://dev.to/upupkenchoong/how-to-set-environment-variable-for-lambda-using-cdk-4m36</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/upupkenchoong/how-to-provision-lambda-and-lambda-layer-with-cdk-2ff4"&gt;previous post&lt;/a&gt;, I show how to make a Lambda function using CDK. In this post, I will show we can set the environment variable, so we can use it inside the Lambda function. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use environment variable?&lt;/strong&gt;&lt;br&gt;
You want to access different value of a variable depending on production or development environment, but this value is very important, you need to keep it secret, not comfortable to keep it in version control(eg. github). &lt;/p&gt;

&lt;p&gt;Some example use case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access different database depending on production environment&lt;/li&gt;
&lt;li&gt;Access different Stripe credential depending on environment. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;br&gt;
In this example, we access different database URL depending on environment.&lt;/p&gt;

&lt;p&gt;Use back the previos Lambda function &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="n"&gt;my_first_lambda_function&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;PythonFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MyFirstLambda&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lambda/MyFirstLambdaFunction&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;app.py&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lambda_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PYTHON_3_8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;boto3_lambda_layer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# ADD THIS, FILL IT FOR ACTUAL VALUE 
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production_db_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_ACTUAL_PROD_DB_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;development_db_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_ACTUAL_DEV_DB_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MyFirstLambdaHandler&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now, we already define the environment variable, now we need to access this inside our Lambda function. &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;MyFirstLambdaHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dynamodb&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# You get the value back like this
&lt;/span&gt;    &lt;span class="n"&gt;prod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;production_db_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;development_db_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# later you other stuff using the above value
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ok, for now you know how to define the environment variable and use it inside the Lambda function. You can put in any value inside &lt;code&gt;environment&lt;/code&gt;, in key value depending on you need.&lt;/p&gt;

&lt;p&gt;May be you not sure why you need to set &lt;code&gt;environment variable&lt;/code&gt; for now, but is ok, next part of the series, you will connecting the dots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In next part of the series:&lt;/strong&gt;&lt;br&gt;
We will talk about &lt;code&gt;version&lt;/code&gt;, &lt;code&gt;alias&lt;/code&gt; for the Lambda function, APIgateway with &lt;code&gt;stageVariables&lt;/code&gt;, and use different environment value depending on the Lambda &lt;code&gt;alias&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you go,&lt;/strong&gt; if you like this series or find this useful consider to buy me a coffee 😊🤞 for 5 USD or more. &lt;br&gt;
I will prepare a GitHub repo for this whole tutorial series and arrange into separate commit for each part. &lt;br&gt;
This will only available for my supporter cause I spent a lot of time to prepare this. Anyway, I appreciate you here. Have a good day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kenchoong" rel="noopener noreferrer"&gt;&lt;br&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fap0mog1ue623vr1zbo36.jpg" alt="bmaco"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shout out to me on Twitter: &lt;a href="https://twitter.com/upupkenchoong" rel="noopener noreferrer"&gt;@upupkenchoong&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cdk</category>
      <category>python</category>
    </item>
    <item>
      <title>How to provision Lambda and Lambda Layer using CDK</title>
      <dc:creator>Ken Choong</dc:creator>
      <pubDate>Thu, 18 Mar 2021 01:32:18 +0000</pubDate>
      <link>https://dev.to/upupkenchoong/how-to-provision-lambda-and-lambda-layer-with-cdk-2ff4</link>
      <guid>https://dev.to/upupkenchoong/how-to-provision-lambda-and-lambda-layer-with-cdk-2ff4</guid>
      <description>&lt;h3&gt;
  
  
  Why using CDK?
&lt;/h3&gt;

&lt;p&gt;CDK let you provision all your aws service using the programming language you use. &lt;/p&gt;

&lt;p&gt;In this example, I will define a Lambda and Lambda Layers using CDK python. &lt;/p&gt;

&lt;p&gt;First, make a new project &lt;/p&gt;

&lt;p&gt;&lt;code&gt;cdk init my-sample-app --language python&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then activate the virtual env &lt;/p&gt;

&lt;p&gt;&lt;code&gt;.env\Scripts\activate.bat&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Set up the project structure &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

my-sample-app
|-lambda
|--boto3Folder
|--MyFirstLambdaFunction
|---app.py
|--All the lambda folder here
|-MySampleAppStack
|--my_sample_stack.py


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What is Lambda Layer?&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;In my own words:&lt;/em&gt;&lt;br&gt;
Lambda Layers is the place you install your library in cloud. Normally you just &lt;code&gt;pip install some-library&lt;/code&gt; for your python project right? Lambda Layers is just do that, you install a library inside a local folder, then CDK help you package all file inside that folder and upload it to cloud, then you can use it elsewhere. &lt;/p&gt;

&lt;p&gt;First install boto3 library inside &lt;code&gt;lambda/boto3Folder&lt;/code&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;yourLocalPath&lt;/span&gt;\&lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;\&lt;span class="k"&gt;lambda&lt;/span&gt;\&lt;span class="n"&gt;boto3Folder&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;By this, you install &lt;code&gt;boto3&lt;/code&gt; library into &lt;code&gt;my-sample-app/lambda/boto3Folder&lt;/code&gt;, then you should see some file and folder inside &lt;code&gt;boto3Folder&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then inside &lt;code&gt;my_sample_stack.py&lt;/code&gt;, define the Lambda Layer as follow:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_cdk.aws_lambda_python&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PythonFunction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PythonLayerVersion&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MySampleStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Construct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
           &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

           &lt;span class="c1"&gt;# All the aws resources define here
&lt;/span&gt;
            &lt;span class="c1"&gt;# Here define a Lambda Layer 
&lt;/span&gt;            &lt;span class="n"&gt;boto3_lambda_layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PythonLayerVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
               &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Boto3LambdaLayer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lambda/boto3Folder&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;compatible_runtimes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lambda_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PYTHON_3_8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
               &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Boto3 Library&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;layer_version_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Whatever name you want&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
           &lt;span class="p"&gt;)&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In this few lines of code, you defined a Lambda Layer, tell CDK where is the folder in &lt;code&gt;entry&lt;/code&gt;, in our case is &lt;code&gt;lambda/boto3Folder&lt;/code&gt; and other necessary information. &lt;/p&gt;

&lt;p&gt;So now you have a Lambda layers, now we want to use this Lambda Layers, inside a Lambda function. &lt;/p&gt;

&lt;p&gt;In &lt;code&gt;MySampleStack&lt;/code&gt; above add this to define a Lambda Function: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="n"&gt;my_first_lambda_function&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;PythonFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
         &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MyFirstLambda&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lambda/MyFirstLambdaFunction&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;app.py&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lambda_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PYTHON_3_8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;boto3_lambda_layer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# here you use the lambda layer above 
&lt;/span&gt;         &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MyFirstLambdaHandler&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This you define a Lambda function that will use the Lambda layers. In your &lt;code&gt;MyFirstLambdaFunction/app.py&lt;/code&gt; you can use &lt;code&gt;boto3&lt;/code&gt; as usual. &lt;/p&gt;

&lt;p&gt;Inside MyFirstLambdaFunction/app.py&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;MyFirstLambdaHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dynamodb&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# do all the stuff with the client
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

cdk deploy


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;All the resources will start provision in the cloud. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why using Lambda Layers?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1) Avoid install the same library over and over again.&lt;/strong&gt;&lt;br&gt;
Lets say you have 10 Lambda function all will using 2 same library, then you will need to install 10 separate times inside 10 Lambda. Use Lambda Layers, install 1 time, you it by 10 different Lambda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Reduce size of your Lambda function.&lt;/strong&gt;&lt;br&gt;
If your Lambda function is more that 10MB, you wont able to edit it in Aws Lambda console. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br&gt;
In this article, you learned &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to create a Lambda Layer and Lambda function&lt;/li&gt;
&lt;li&gt;How to use Lambda Layer inside a Lambda&lt;/li&gt;
&lt;li&gt;Why you need to use a Lambda Layer? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you learned something. Have a good day. &lt;/p&gt;

&lt;p&gt;In next part of series, I will talk about set up environment variable for a Lambda function using CDK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you go,&lt;/strong&gt; if you like this series or find this useful consider to buy me a coffee 😊🤞 for 5 USD or more. &lt;br&gt;
I will prepare a GitHub repo for this whole tutorial series and arrange into separate commit for each part. &lt;br&gt;
This will only available for my supporter cause I spent a lot of time to prepare this. Anyway, I appreciate you here. Have a good day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kenchoong" rel="noopener noreferrer"&gt;&lt;br&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fap0mog1ue623vr1zbo36.jpg" alt="bmaco"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shout out to me on Twitter: &lt;a href="https://twitter.com/upupkenchoong" rel="noopener noreferrer"&gt;@upupkenchoong&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>cdk</category>
      <category>python</category>
    </item>
    <item>
      <title>[Part 1]What is Amazon EventBridge and How to provision Logging S3 bucket, and bucket policy using AwsCDK</title>
      <dc:creator>Ken Choong</dc:creator>
      <pubDate>Fri, 30 Oct 2020 03:29:44 +0000</pubDate>
      <link>https://dev.to/upupkenchoong/part-1-what-is-amazon-eventbridge-and-how-to-provision-logging-s3-bucket-and-bucket-policy-using-awscdk-3g6j</link>
      <guid>https://dev.to/upupkenchoong/part-1-what-is-amazon-eventbridge-and-how-to-provision-logging-s3-bucket-and-bucket-policy-using-awscdk-3g6j</guid>
      <description>&lt;p&gt;As mentioned in &lt;a href="https://dev.to/upupkenchoong/intro-how-to-trigger-a-lambda-function-when-a-file-is-uploaded-to-an-existing-s3-bucket-using-amazon-eventbridge-and-aws-cdk-3m6g"&gt;last part&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We already have a S3 bucket which is Amplify set up for us&lt;/li&gt;
&lt;li&gt;Now when a file uploaded to that bucket, we need to notify a lambda function, which we will use other Aws service inside it&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  What is Amazon EventBridge?
&lt;/h1&gt;

&lt;p&gt;Amazon EventBridge is a serverless event bus service that makes it easy to connect your applications with data from a variety of sources. EventBridge was formerly called Amazon CloudWatch Events. &lt;em&gt;(From &lt;a href="https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html"&gt;aws docs&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Based on my understanding:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anything happen in your resource, will emit an &lt;code&gt;events&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;events&lt;/code&gt; is actually a log files in json format produce by &lt;a href="https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html?icmpid=docs_cloudtrail_console"&gt;CloudTrail&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;EventBridge is the watcher for this &lt;code&gt;events&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You tell EventBrigde about what &lt;code&gt;events&lt;/code&gt; you want to watch(In our case, when a file uploaded to our S3 bucket) &lt;/li&gt;
&lt;li&gt;You tell EventBridge when that &lt;code&gt;events&lt;/code&gt; happen what you want to do(In our case, invoke a Lambda Function) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What we need TODO:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define S3 bucket to store the &lt;code&gt;event&lt;/code&gt; (log files produce by CloudTrail) &lt;/li&gt;
&lt;li&gt;Define the bucket policy for that S3 bucket &lt;em&gt;(Bucket policy)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Tell EventBridge what pattern of &lt;code&gt;event&lt;/code&gt; you want to watch &lt;em&gt;(EventRule)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Tell EventBridge if that pattern of &lt;code&gt;event&lt;/code&gt; happened, what you want it to do. &lt;em&gt;(EventTarget)&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ok, how we do that?&lt;/strong&gt;&lt;br&gt;
In this blog post, we will provisioned all the resource defined above using &lt;a href="https://docs.aws.amazon.com/cdk/latest/guide/home.html"&gt;AWS CDK&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why we use CDK?&lt;/em&gt;&lt;br&gt;
Think about this, AWS have 160+ services. Every time when we need something, we have to define it 1 by 1 in the AWS management console. Very time consuming, need to find service by service in the console. &lt;/p&gt;

&lt;p&gt;No, we don't do that. We write some code using AWS CDK. Then we run a short command &lt;code&gt;cdk deploy&lt;/code&gt;, then everything get set up in the cloud. &lt;/p&gt;

&lt;p&gt;Nice. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's get started&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First set up the cdk project using Python: &lt;/p&gt;

&lt;p&gt;Make a directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir mycdkapp &amp;amp;&amp;amp; cd mycdkapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set up a CDK app&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cdk init app --language python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Activate the virtual environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ .env\Scripts\activate.bat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install all the dependencies needed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cool, so we done setting up a CDK app for our project.&lt;/p&gt;

&lt;p&gt;Now you will see &lt;code&gt;mycdkapp_stack.py&lt;/code&gt; in your directory. This is where we define all the resource need here. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refer to the existing S3 bucket and create a new Logging bucket for CloudTrail&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install the library needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pip install aws_cdk.aws_s3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will install the &lt;code&gt;L1 construct&lt;/code&gt; which represent a single type of aws service. All this create by aws, so every time you need a particular service, you can find the library &lt;a href="https://docs.aws.amazon.com/cdk/api/latest/docs/aws-construct-library.html"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case, we install the &lt;code&gt;aws_s3&lt;/code&gt; library. &lt;/p&gt;

&lt;p&gt;Now paste the code below into &lt;code&gt;mycdkapp_stack.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from aws_cdk import (
    aws_s3 as s3,
    core
)


class MycdkappStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -&amp;gt; None:
        super().__init__(scope, id, **kwargs)

        # refer the existing s3 bucket, substitute &amp;lt;your-existing-s3-bucket-arn&amp;gt; with your bucket arn
        existing_bucket=s3.Bucket.from_bucket_arn(self, "BucketByArn", "arn:aws:s3:::&amp;lt;your-existing-s3-bucket-arn&amp;gt;")

        # this create a new s3 bucket with name s3LoggingBucket
        logging_bucket = s3.Bucket(self,"s3LoggingBucket", bucket_name="s3loggingbucket")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With just 2 lines of code, we already get the &lt;code&gt;existing_bucket&lt;/code&gt; and created a new bucket named &lt;code&gt;s3LoggingBucket&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Now run this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cdk synth &amp;gt; template.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see a template.yaml in your directory. &lt;/p&gt;

&lt;p&gt;Next we need to set up Bucket policy for this Logging bucket. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make a new directory name &lt;code&gt;contruct&lt;/code&gt; inside &lt;code&gt;mycdkapp&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Create a new file named &lt;code&gt;logging_policy.py&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pip install aws_cdk.aws_iam&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Paste this below code into &lt;code&gt;logging_policy.py&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from aws_cdk import (
    aws_s3 as s3,
    aws_iam as iam,
    core,
)

class LoggingBucketPolicy(core.Construct):

    def __init__(self,scope: core.Construct, id: str, _bucket: s3.IBucket, **kwargs):
        super().__init__(scope,id, **kwargs)

        cloudtrail_service_principal = iam.ServicePrincipal('cloudtrail.amazonaws.com')
        get_bucket_policy = iam.PolicyStatement(
            actions=["s3:GetBucketAcl"],
            resources=[_bucket.bucket_arn],
            principals=[cloudtrail_service_principal]
            )

        put_object_policy = iam.PolicyStatement(
                actions=['s3:PutObject'],
                resources=[f"arn:aws:s3:::{_bucket.bucket_name}/AWSLogs/{core.Environment.account}/*"],
                principals=[cloudtrail_service_principal]
            )

        _bucket.add_to_resource_policy(get_bucket_policy)
        _bucket.add_to_resource_policy(put_object_policy)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is this code above do?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We define a &lt;code&gt;Construct&lt;/code&gt; by inherit &lt;code&gt;core.Construct&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;This let us group together all the component which doing the same thing(In this case, this construct will define policy to a bucket) &lt;/li&gt;
&lt;li&gt;We will insert &lt;code&gt;s3.IBucket&lt;/code&gt; into this &lt;code&gt;construct&lt;/code&gt; with variable &lt;code&gt;_bucket&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Define 2 &lt;code&gt;iam&lt;/code&gt; policy &lt;code&gt;get_object_policy&lt;/code&gt; and &lt;code&gt;put_object_policy&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Allow both policy can use by &lt;code&gt;cloudtrail.amazonaws.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Then the policy to the &lt;code&gt;_bucket&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now in our &lt;code&gt;mycdkapp_stack.py&lt;/code&gt; add this line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LoggingBucketPolicy(self, 's3Policy', logging_bucket)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cdk synth &amp;gt; template.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now check &lt;code&gt;template.yaml&lt;/code&gt;, you will see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s3LoggingBucketPolicyEF0E9CBA:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket:
        Ref: s3LoggingBucket06C9F6F3
      PolicyDocument:
        Statement:
          - Action: s3:GetBucketAcl
            Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Resource:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done. &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Now you successfully: *&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand what is Amazon Eventbridge and why we use it. &lt;/li&gt;
&lt;li&gt;Understand what is Aws CDK and why we use it. &lt;/li&gt;
&lt;li&gt;Refer the existing bucket into our newly created cdk app. &lt;/li&gt;
&lt;li&gt;Create a new Logging bucket for CloudTrail using CDK&lt;/li&gt;
&lt;li&gt;Apply all bucket policy to the new bucket using CDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*&lt;em&gt;Next we will talking about, *&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to define a Event rule/pattern for Amazon Eventbrige?&lt;/li&gt;
&lt;li&gt;When the certain pattern in Eventbridge occurred, what should do next? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All using CDK. &lt;/p&gt;

&lt;h2&gt;
  
  
  Stay tuned. 
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/upupkenchoong/intro-how-to-trigger-a-lambda-function-when-a-file-is-uploaded-to-an-existing-s3-bucket-using-amazon-eventbridge-and-aws-cdk-3m6g"&gt;[Intro] How to trigger a Lambda function when a file is uploaded to an existing S3 bucket using Amazon EventBridge and AWS CDK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[Part 1]What is Amazon EventBridge and How to provision Logging S3 bucket, and bucket policy using AwsCDK&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Coming soon&lt;/em&gt;&lt;br&gt;
[Part 2] How to define EventRule, EventTarget for Amazon Eventbridge using CDK. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Before you go,&lt;/strong&gt; if you like this series or find this useful consider to buy me a coffee 😊🤞 for 5 USD or more. &lt;br&gt;
I will prepare a GitHub repo for this whole tutorial series and arrange into separate commit for each part. &lt;br&gt;
This will only available for my supporter cause I spent a lot of time to prepare this. Anyway, I appreciate you here. Have a good day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kenchoong"&gt;&lt;br&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jd2kBH9o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ap0mog1ue623vr1zbo36.jpg" alt="bmaco"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on Twitter: &lt;a href="https://twitter.com/upupkenchoong"&gt;@upupkenchoong&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My upcoming product(If you interested): &lt;a href="https://twitter.com/sarah_assistant"&gt;@sarah_assistant&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awscdk</category>
      <category>serverless</category>
    </item>
    <item>
      <title>[Intro] How to trigger a Lambda function when a file is uploaded to an existing S3 bucket using Amazon EventBridge and AWS CDK</title>
      <dc:creator>Ken Choong</dc:creator>
      <pubDate>Thu, 29 Oct 2020 10:44:12 +0000</pubDate>
      <link>https://dev.to/upupkenchoong/intro-how-to-trigger-a-lambda-function-when-a-file-is-uploaded-to-an-existing-s3-bucket-using-amazon-eventbridge-and-aws-cdk-3m6g</link>
      <guid>https://dev.to/upupkenchoong/intro-how-to-trigger-a-lambda-function-when-a-file-is-uploaded-to-an-existing-s3-bucket-using-amazon-eventbridge-and-aws-cdk-3m6g</guid>
      <description>&lt;p&gt;*&lt;em&gt;In this series of blog post, what we gonna to do is: *&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Observe a file is uploaded to an existing S3 bucket using Amazon EventBridge&lt;/li&gt;
&lt;li&gt;When Amazon EventBridge notice a file is uploaded to S3 bucket, it will trigger a Lambda function. &lt;/li&gt;
&lt;li&gt;Provision our Lambda Function, Amazon EventBridge, Policy and all other resources using AWS CDK. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You using Aws Amplify for Android app. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Now you need storage&lt;/em&gt;&lt;br&gt;
so you can store the images, video or audio your user upload from you app. &lt;/p&gt;

&lt;p&gt;So you do this: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;amplify add storage&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Answer a few question in Amplify CLI like showing &lt;a href="'https://docs.amplify.aws/lib/storage/getting-started/q/platform/android#provision-backend-storage'"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Amplify provisioned a S3 bucket for you. Nice and easy. Now you can upload your user file into this bucket. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow with this scenario:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now you have an existing S3 bucket which generated by Aws Amplify&lt;/li&gt;
&lt;li&gt;When user upload the file to this bucket, you want to trigger a Lambda function which you can use other AWS service. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When an image is uploaded to the bucket, you want to use AWS Rekognition to do face recognition&lt;/li&gt;
&lt;li&gt;When an audio file uploaded to the bucket, you want to use AWS Transcribe to transcribe the audio file to words. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is how? &lt;/p&gt;

&lt;p&gt;Stay Tuned. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/upupkenchoong/part-1-what-is-amazon-eventbridge-and-how-to-provision-logging-s3-bucket-and-bucket-policy-using-awscdk-3g6j"&gt;[Part 1]What is Amazon EventBridge and How to provision Logging S3 bucket, and bucket policy using AwsCDK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you go,&lt;/strong&gt; if you like this series or find this useful consider to buy me a coffee 😊🤞 for 5 USD or more. &lt;br&gt;
I will prepare a GitHub repo for this whole tutorial series and arrange into separate commit for each part. &lt;br&gt;
This will only available for my supporter cause I spent a lot of time to prepare this. Anyway, I appreciate you here. Have a good day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kenchoong" rel="noopener noreferrer"&gt;&lt;br&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fap0mog1ue623vr1zbo36.jpg" alt="bmaco"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow me on Twitter:&lt;/strong&gt; &lt;a href="https://twitter.com/upupkenchoong" rel="noopener noreferrer"&gt;@upupkenchoong&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My upcoming product(If you interested):&lt;/strong&gt; &lt;a href="https://twitter.com/sarah_assistant" rel="noopener noreferrer"&gt;@sarah_assistant&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>awslambda</category>
      <category>awscdk</category>
    </item>
  </channel>
</rss>
