การสร้าง AWS Lambda โดยใช้ NodejsFunction ของ CDK ใน EC2 Instance

การใช้งาน AWS CDK กับ AWS Lambda จะทำให้กระบวนการสร้างและจัดการ Lambda functions เป็นเรื่องง่ายและมีประสิทธิภาพมากขึ้น ในบทความนี้จะมาแนะนำวิธีการสร้าง Lambda โดยใช้ NodejsFunction ของ CDK ใน EC2 Instance (Amazon Linux 2023) กันครับ

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

ผมได้มีโอกาสเรียนรู้เกี่ยวกับการใช้งาน AWS CDK กับ AWS Lambda ในส่วนของการสร้าง AWS Lambda โดยใช้ NodejsFunction ใน CDK จึงอยากจะมาแนะนำในบทความนี้ครับ

ข้อดีการใช้ CDK กับ AWS Lambda

การใช้งาน AWS Cloud Development Kit (CDK) กับ AWS Lambda นั้นมีข้อดีหลายอย่างที่ช่วยให้กระบวนการสร้างและจัดการ Lambda functions เป็นเรื่องง่ายและมีประสิทธิภาพมากขึ้น นี่คือข้อดีบางประการของการใช้งาน CDK กับ Lambda:

  • Infrastructure as Code (IaC): CDK ช่วยให้คุณสร้างสถาปัตยกรรมของ AWS ในรูปแบบของโค้ด ซึ่งทำให้เป็น IaC ที่เราสามารถตรวจสอบและเก็บรักษาเวอร์ชันของสถาปัตยกรรมได้ นักพัฒนาสามารถเก็บรักษาสถาปัตยกรรมเหมือนการจัดการโค้ดที่มีประสิทธิภาพเทียบเท่ากัน
  • Productivity: CDK ช่วยลดเวลาและความซับซ้อนในกระบวนการสร้าง Lambda functions โดยอนุญาตให้คุณใช้ภาษาโปรแกรมที่คุณคุ้นเคยเพื่อกำหนดสถาปัตยกรรม คุณไม่จำเป็นต้องเขียน CloudFormation template เพื่อกำหนดค่า Lambda function แยกตัว เนื่องจาก CDK จะสร้างคำสั่ง CloudFormation ให้คุณโดยอัตโนมัติ
  • Reusable Constructs: CDK มีคอนเซ็ปต์ที่สามารถใช้ซ้ำได้ (reusable constructs) ซึ่งช่วยให้คุณสร้าง Lambda functions ในแบบที่คุณต้องการ คุณสามารถใช้คอนเซ็ปต์พร้อมใช้ที่มีอยู่หรือสร้างคอนเซ็ปต์ของคุณเองเพื่อใช้ในโปรเจคที่มากขึ้น
  • Type Safety: CDK เป็นภาษาเทพอย่าง TypeScript หรือ Python ช่วยให้คุณสามารถใช้การตรวจสอบชนิดของ TypeScript หรือการตรวจสอบชนิดของ Python เพื่อความถูกต้องและความปลอดภัยในโค้ดของคุณ
  • Seamless Integration: CDK ทำให้คุณสามารถสร้างและจัดการ Lambda functions ร่วมกับทรัพยากร AWS อื่นๆ ได้ง่ายขึ้น เช่น Amazon S3, Amazon DynamoDB, Amazon API Gateway, Amazon SQS เป็นต้น ซึ่งช่วยให้คุณสร้างแอปพลิเคชันที่มีขนาดใหญ่และรวดเร็วมากขึ้น
  • Easy Deployment: CDK ช่วยให้กระบวนการสร้าง Lambda functions เป็นเรื่องง่ายและสามารถนำไปใช้งานได้ทันที คุณสามารถสร้างและอัปเดต Lambda functions ของคุณด้วยคำสั่ง cdk deploy เพื่อดำเนินการที่รวดเร็วและสะดวกสบาย

เป้าหมาย

การสร้าง AWS Lambda ครั้งนี้ ผมจะใช้ NodejsFunction ของ CDK ที่มีการเขียนไว้ใน CDK TypeScript project (custom-widget-lambda-sample) บน GitHub ติดตั้งลงใน EC2 Instance (Amazon Linux 2023) แล้วทำการ Deploy ไปยัง AWS Lambda ใน Amazon Linux 2023 นี้เลยครับ

สร้าง IAM Role

ครั้งนี้จะสร้าง SSM Role ใน IAM Role โดยมีองค์ประกอบดังนี้

Role
Role name tinnakorn-cdk-lambda-ssm
Policy name AmazonSSMManagedInstanceCore (มีอยู่ใน Policies)
CDKExecution (สร้างเองแบบ inline policy ใน Role ของเราโดยใช้ชื่อที่ต้องการ)

ดูตัวอย่างวิธีการสร้าง SSM Role ได้ที่ลิงก์บทความด้านล่างนี้

เมื่อสร้าง IAM Role ตามลิงก์ตัวอย่างด้านบนเสร็จแล้ว เข้ามาที่ Role ของเรา
จะเห็นว่ามี Policy name: AmazonSSMManagedInstanceCore แสดงอยู่ในแท็บ Permissions แบบนี้ครับ

ต่อไปเราจะมาเพิ่ม Permissions สำหรับ CDK โดยการสร้าง Create inline policy ใน Role(tinnakorn-cdk-lambda-ssm) ที่เราสร้างเมื่อสักครู่นี้

คลิกที่ Add permissions และเลือก Create inline policy

Step 1 - Specify permissions
เลือก JSON แล้วลบ Policy เก่าออกทั้งหมด แล้วคัดลอก Policy ด้านล่างนี้วางแทนที่ก็จะแสดงตามรูปภาพ และเลื่อนลงมาด้านล่าง แล้วคลิก Next

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::*:role/cdk-*"
            ]
        }
    ]
}

Step 2 - Review and create
ป้อน Policy name: CDKExecution (ชื่ออะไรก็ได้) แล้วคลิก Create policy

แล้วดูในแท็บ Permissions จะเห็นว่ามี Policy name: CDKExecution ที่สร้างขึ้นมาแล้ว

สร้าง EC2 Instance และเพิ่ม SSM Role ใน EC2 Instance

ดูตัวอย่างได้ที่ลิงก์บทความด้านล่างนี้ (หากมีขั้นตอนที่ทำไปแล้ว ข้ามไปหัวข้อที่ยังไม่ได้ทำได้เลย)

ครั้งนี้จะสร้าง EC2 Instance (Amazon Linux 2023) และเพิ่ม IAM Role ใน EC2 Instance โดยมีองค์ประกอบดังนี้

EC2 Instance (Amazon Linux 2023)
Instance name tinnakorn-cdk-lambda
Amazon Machine Image (AMI) Amazon Linux 2023 AMI
Instance type t3a.small (หากใช้ Instance Type ที่ต่ำกว่านี้ อาจทำให้เกิดปัญหาตอนรันคำสั่งได้ เช่น รันคำสั่งแล้วไม่ตอบสนอง เป็นตัน)
Key pair name Proceed without a key pair (Not recommended)
Firewall (security groups) Select existing security group (Common security groups จะปล่อยว่างไว้)
IAM instance profile (IAM Role ที่สร้างจากขั้นตอนที่แล้ว)

เมื่อสร้าง EC2 Instance เสร็จแล้ว ให้ดูที่ IAM Role หากมี IAM Role เพิ่มเข้ามาแบบนี้ ถือว่าการเพิ่ม IAM Role ใน EC2 Instance เสร็จเรียบร้อยครับ

การติดตั้ง CDK และ Softwere ใน EC2 Instance (Amazon Linux 2023)

ครั้งนี้ผมจะติดตั้ง CDK TypeScript project และ Softwere ต่างๆ ที่เกี่ยวข้องในการดำเนินการทั้งหมดลงใน EC2 Instance ผ่าน Session Manager

ก่อนอื่นให้เชื่อมต่อ EC2 Instance ผ่าน Session Manager หากเชื่อมต่อเข้ามาแล้วจะแสดงหน้าจอแบบนี้
แล้วทำการรันคำสั่งต่างๆ ตามด้านล่างนี้ได้เลยครับ

Root access

แล้วรันคำสั่งเข้าใช้งานสิทธิ์ root

sudo su -


และรันคำสั่งเข้าไปที่โฟลเดอร์ ec2-user ตามนี้ เนื่องจากผมจะ Copy CDK TypeScript project จาก GitHub ลงที่นี่

cd /home/ec2-user

Install Node.js and npm

คำสั่งเพิ่ม NodeSource yum repository
* แนะนำให้ติดตั้งเป็น V.18 เพื่อให้สอดคล้องกับการทำงานของ CDK TypeScript project ที่จะใช้ในครั้งนี้

curl -sL https://rpm.nodesource.com/setup_18.x | sudo bash


คำสั่งติดตั้ง Node.js และ npm

yum install -y nodejs


คำสั่งตรวจสอบเวอร์ชัน Node.js

node -v


คำสั่งตรวจสอบเวอร์ชัน npm

npm -v

Install CDK project

ครั้งนี้จะใช้โปรเจกต์ custom-widget-lambda-sample บน GitHub ติดตั้งลงใน Amazon Linux 2023 ครับ

ก่อนอื่นเราต้องติดตั้ง Git สำหรับ Linux เพื่อให้สามารถใช้คำสั่งของ Git ได้โดยรันคำสั่งตามนี้

yum install git -y


แล้วรันคำสั่ง Clone เพื่อ Copy custom-widget-lambda-sample จาก GitHub ลงใน Amazon Linux 2023 ตามนี้

git clone https://github.com/eetann/custom-widget-lambda-sample.git


แล้วเข้าไปที่โฟลเดอร์โปรเจกต์ custom-widget-lambda-sample

cd custom-widget-lambda-sample

Install the AWS CDK

คำสั่งดาวน์โหลดและติดตั้งแพ็กเกจทั้งหมดไว้ในโฟล์เดอร์ node_modules

npm install


คำสั่งติดตั้ง TypeScript จาก npm ไปยัง Amazon Linux 2023 ของเราในระดับ global

npm install typescript -g


คำสั่งที่ใช้ในการ Compile โค้ดภาษา TypeScript เป็นโค้ดภาษา JavaScript ด้วย TypeScript Compiler (tsc) (คำสั่ง tsc จะใช้เวลารอสักครู่ ให้รอประมาณ 1-2 นาที)

tsc


คำสั่งติดตั้ง AWS CDK จาก npm ไปยัง Amazon Linux 2023 ของเราในระดับ global

npm install -g aws-cdk


คำสั่งตรวจสอบ cdk หากแสดงชุดคำสั่งและคำอธิบายต่างๆ ถือว่าการติดตั้ง cdk สำเร็จ

cdk


คำสั่งตรวจสอบ aws cli หากแสดงชุดคำสั่งต่างๆ ถือว่าการติดตั้ง aws cli สำเร็จ (aws cli จะถูกติดตั้งมาพร้อมกับ cdk)

aws cli

การ Deploy CDK ไปยัง Lambda

รันคำสั่งตามด้านล่างนี้เพื่อให้สามารถ Deploy CDK ไปยัง Lambda ได้ครับ

คำสั่งที่ใช้ในการเปรียบเทียบการเปลี่ยนแปลง (diff) ของ Infrastructure as Code ในโปรเจค CDK ของเรากับ Infrastructure as Code ที่กำลังถูกแยกออกมาอยู่ใน AWS

cdk diff

ผลลัพธ์

Session ID: role_name-xxxxxxxxxx  Instance ID: i-xxxxxxxxxx

[root@ip-xx-xx-xx-xx custom-widget-lambda-sample]# cdk diff
Stack CustomWidgetLambdaSampleStack
IAM Statement Changes
┌───┬───────────────────────────────────────┬────────┬────────────────┬──────────────────────────────┬───────────┐
│   │ Resource                              │ Effect │ Action         │ Principal                    │ Condition │
├───┼───────────────────────────────────────┼────────┼────────────────┼──────────────────────────────┼───────────┤
│ + │ ${CustomWidgetLambda/ServiceRole.Arn} │ Allow  │ sts:AssumeRole │ Service:lambda.amazonaws.com │           │
└───┴───────────────────────────────────────┴────────┴────────────────┴──────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬───────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────┐
│   │ Resource                          │ Managed Policy ARN                                                             │
├───┼───────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────┤
│ + │ ${CustomWidgetLambda/ServiceRole} │ arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole │
└───┴───────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Parameters
[+] Parameter BootstrapVersion BootstrapVersion: {"Type":"AWS::SSM::Parameter::Value","Default":"/cdk-bootstrap/hnb659fds/version","Description":"Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"}

Conditions
[+] Condition CDKMetadata/Condition CDKMetadataAvailable: {"Fn::Or":[{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"af-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ca-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-northwest-1"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-3"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"me-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"sa-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-2"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-2"]}]}]}

Resources
[+] AWS::IAM::Role CustomWidgetLambda/ServiceRole CustomWidgetLambdaServiceRole2A9E1A93
[+] AWS::Lambda::Function CustomWidgetLambda CustomWidgetLambda25425A83

Other Changes
[+] Unknown Rules: {"CheckBootstrapVersion":{"Assertions":[{"Assert":{"Fn::Not":[{"Fn::Contains":[["1","2","3","4","5"],{"Ref":"BootstrapVersion"}]}]},"AssertDescription":"CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."}]}}


[root@ip-xx-xx-xx-xx custom-widget-lambda-sample]#


คำสั่งที่ใช้ในการสังเคราะห์ (Synthesize) รหัสสำหรับ Infrastructure as Code ที่เรากำหนดไว้ในโค้ด CDK ของเราเพื่อสร้างรายการของคำสั่งในรูปแบบของ AWS CloudFormation ซึ่งจะใช้ในการสร้าง Infrastructure as Code ของ AWS ในขั้นตอนต่อไป

cdk synth
คลิกขยายเพื่อดูผลลัพธ์ (เนื่องจาก Code มีความยาว จึงเขียนแบบเต็มไว้ใน details ด้านล่างนี้)

Session ID: role_name-xxxxxxxxxx  Instance ID: i-xxxxxxxxxx

[root@ip-xx-xx-xx-xx custom-widget-lambda-sample]# cdk synth
Bundling asset CustomWidgetLambdaSampleStack/CustomWidgetLambda/Code/Stage...

  cdk.out/bundling-temp-13170c4874e1d9452093f95c5249dbc6f8bbb6c2d9359d0cec560e24f20aa51f/index.js  3.5kb

⚡ Done in 17ms
Resources:
  CustomWidgetLambdaServiceRole2A9E1A93:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action: sts:AssumeRole
            Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
        Version: "2012-10-17"
      ManagedPolicyArns:
        - Fn::Join:
            - ""
            - - "arn:"
              - Ref: AWS::Partition
              - :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
    Metadata:
      aws:cdk:path: CustomWidgetLambdaSampleStack/CustomWidgetLambda/ServiceRole/Resource
  CustomWidgetLambda25425A83:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        S3Bucket:
          Fn::Sub: cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}
        S3Key: e1ce82a868cbb393e258ad9b82d4d9a80d6763bb3f6e9823c1b5af3e98287dcf.zip
      Role:
        Fn::GetAtt:
          - CustomWidgetLambdaServiceRole2A9E1A93
          - Arn
      Environment:
        Variables:
          AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1"
      Handler: index.handler
      Runtime: nodejs14.x
    DependsOn:
      - CustomWidgetLambdaServiceRole2A9E1A93
    Metadata:
      aws:cdk:path: CustomWidgetLambdaSampleStack/CustomWidgetLambda/Resource
      aws:asset:path: asset.e1ce82a868cbb393e258ad9b82d4d9a80d6763bb3f6e9823c1b5af3e98287dcf
      aws:asset:is-bundled: true
      aws:asset:property: Code
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Analytics: v2:deflate64:H4sIAAAAAAAA/zWOzQ6CMAyAn4X7qCImehUTjx7wAUjZJik/XUI3PRDe3THi6UubL197gnMJRYZfybUZ8pFaWF4e9aDiqllGnFqDDTtje4FnwiOw9uRYEU6w1G606v7mjauSskER6wVuG+IMVdCD9RWKVXsNov1vrCp58WJH3KWOFRdmnZp3x4Z2bfsAejl8iisUFzhmvRDlc2BPk4V65w+M1M+4zQAAAA==
    Metadata:
      aws:cdk:path: CustomWidgetLambdaSampleStack/CDKMetadata/Default
    Condition: CDKMetadataAvailable
Conditions:
  CDKMetadataAvailable:
    Fn::Or:
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - af-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ca-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-northwest-1
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-2
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-3
          - Fn::Equals:
              - Ref: AWS::Region
              - me-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - sa-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-2
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-2
Parameters:
  BootstrapVersion:
    Type: AWS::SSM::Parameter::Value
    Default: /cdk-bootstrap/hnb659fds/version
    Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]
Rules:
  CheckBootstrapVersion:
    Assertions:
      - Assert:
          Fn::Not:
            - Fn::Contains:
                - - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
                - Ref: BootstrapVersion
        AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.


[root@ip-xx-xx-xx-xx custom-widget-lambda-sample]#


คำสั่งที่ใช้ในกระบวนการสร้าง Infrastructure as Code ที่เราได้กำหนดไว้ในโค้ด CDK ของเราและนำไปสร้างขึ้นในบัญชี AWS
เมื่อรันคำสั่งไปแล้ว จะมีข้อความว่า "Do you wish to deploy these changes (y/n)?" ให้พิมพ์ y

cdk deploy
คลิกขยายเพื่อดูผลลัพธ์ (เนื่องจาก Code มีความยาว จึงเขียนแบบเต็มไว้ใน details ด้านล่างนี้)

Session ID: role_name-xxxxxxxxxx  Instance ID: i-xxxxxxxxxx

[root@ip-xx-xx-xx-xx custom-widget-lambda-sample]# cdk deploy
Bundling asset CustomWidgetLambdaSampleStack/CustomWidgetLambda/Code/Stage...

  cdk.out/bundling-temp-13170c4874e1d9452093f95c5249dbc6f8bbb6c2d9359d0cec560e24f20aa51f/index.js  3.5kb

⚡ Done in 14ms

✨  Synthesis time: 15.98s

CustomWidgetLambdaSampleStack:  start: Building 5a2ca64b9b5951291833d60cb403e9e71fc9947ac5d885f84540185594452af8:current_account-current_region
CustomWidgetLambdaSampleStack:  success: Built 5a2ca64b9b5951291833d60cb403e9e71fc9947ac5d885f84540185594452af8:current_account-current_region
CustomWidgetLambdaSampleStack:  start: Publishing 5a2ca64b9b5951291833d60cb403e9e71fc9947ac5d885f84540185594452af8:current_account-current_region
CustomWidgetLambdaSampleStack:  success: Published 5a2ca64b9b5951291833d60cb403e9e71fc9947ac5d885f84540185594452af8:current_account-current_region
This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:

IAM Statement Changes
┌───┬───────────────────────────────────────┬────────┬────────────────┬──────────────────────────────┬───────────┐
│   │ Resource                              │ Effect │ Action         │ Principal                    │ Condition │
├───┼───────────────────────────────────────┼────────┼────────────────┼──────────────────────────────┼───────────┤
│ + │ ${CustomWidgetLambda/ServiceRole.Arn} │ Allow  │ sts:AssumeRole │ Service:lambda.amazonaws.com │           │
└───┴───────────────────────────────────────┴────────┴────────────────┴──────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬───────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────┐
│   │ Resource                          │ Managed Policy ARN                                                             │
├───┼───────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────┤
│ + │ ${CustomWidgetLambda/ServiceRole} │ arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole │
└───┴───────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Do you wish to deploy these changes (y/n)? y
CustomWidgetLambdaSampleStack: deploying... [1/1]
CustomWidgetLambdaSampleStack: creating CloudFormation changeset...

 ✅  CustomWidgetLambdaSampleStack

✨  Deployment time: 51.76s

Stack ARN:
arn:aws:cloudformation:ap-southeast-1:xxxxxxxxxx:stack/CustomWidgetLambdaSampleStack/3d9b4bf0-2d2d-11ee-8c8e-0a71fcee1a86

✨  Total time: 67.74s


[root@ip-xx-xx-xx-xx custom-widget-lambda-sample]#

ตรวจสอบ CDK TypeScript project ใน Lambda

ก่อนอื่นให้เข้าไปที่ Service "CloudFormation > Stacks"
ค้นหาและคลิก Stacks ของเรา เช่น CustomWidgetLambdaSampleStack

แล้วจะมีข้อมูลการ Deploy แสดงที่หน้าต่างด้านขวา ให้เลือกแท็บ Resources
แล้วคลิกขยายที่ + CustomWidgetLambda ในคอลัมน์ Logical ID
แล้วคลิกลิงก์ในคอลัมน์ Physical ID เพื่อเข้าไปหน้าจอ Lambda functions

เมื่อเข้ามาหน้าจอ Lambda functions แล้ว จะแสดงหน้าจอแบบนี้

แล้วเลื่อนลงมาด้านล่าง ก็จะเห็นข้อมูลในแท็บต่างๆ

เพียงเท่านี้เราก็สามารถ Deploy CDK TypeScript project เพื่อสร้าง Lambda ผ่าน EC2 Instance (Amazon Linux 2023) สำเร็จได้อย่างง่ายดายครับ

การลบ AWS Resource

AWS Resource ที่จะลบทั้งหมดมีดังนี้

Service name Function name
CloudFormation Stacks
Lambda Functions
EC2 Instances
IAM Roles

ผมจะแนะวิธีการลบ Resource ต่างๆ ที่แสดงอยู่ในตาราง Function name ด้านบนดังนี้

การลบ Stacks ใน CloudFormation

เข้าไปที่ Service "CloudFormation > Stacks" ค้นหาและเลือกอันที่ต้องการลบ คลิก Delete และยืนยันการลบตามคำแนะนำ

สำหรับการลบ Functions ใน Lambda เราไม่จำเป็นต้องไปลบเอง เพราะหลังจากที่ลบ Stacks ใน CloudFormation เสร็จแล้ว Functions ใน Lambda จะถูกลบออกโดยอัตโนมัติครับ

การ Terminate Instances ใน EC2

ดูตัวอย่างการ Terminate Instances ได้ที่ลิงก์ด้านล่างนี้

การลบ Roles ใน IAM

เข้าไปที่ Service "IAM > Roles" ค้นหาและเลือกอันที่ต้องการลบ คลิก Delete และยืนยันการลบตามคำแนะนำ

สรุป

CDK เป็นเครื่องมือที่ทำให้การสร้างและจัดการ Lambda functions ง่ายและมีประสิทธิภาพ โดยทำให้นักพัฒนาสามารถเขียนโค้ดที่เข้าใจได้ง่ายและสร้างสถาปัตยกรรมของ AWS ที่มีประสิทธิภาพและสามารถนำไปใช้งานได้จริง

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

บทความที่เกี่ยวข้อง