aws step function 筆記

最近工作用到一些工具,使用到AWS step function , 因此在這裡也筆記一下…

也在公司後端組例會分享了一下(以下就是我分享的PPT ):

其實我覺得我用的情境很簡單,只是用Map 的方式啟動lambda . 這個 lambda 就是我用來處理下載與上傳到s3指定位置… 說真的應用的情境真的很不多… 還有更多著墨的空間。

另外,自己同時也針對此寫了兩個版本,用SAM 和 用 CDK 的版本…

一、CDK 的版本

import * as cdk from '@aws-cdk/core';
import * as lambda from "@aws-cdk/aws-lambda"
import * as stepfunctions from "@aws-cdk/aws-stepfunctions"
import * as tasks from "@aws-cdk/aws-stepfunctions-tasks"
import * as logs from "@aws-cdk/aws-logs"
import * as s3 from "@aws-cdk/aws-s3"
import * as ec2 from "@aws-cdk/aws-ec2"
import * as dotenv from 'dotenv';

export class CdkLambdaStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // 將裡面比較敏感的資訊用env 包起來, 注意後面的path 要正確
    dotenv.config({path:__dirname+'/../.env'})
    
    // 我要上傳音檔的S3 目標 arn:aws:s3:::test 為虛構(我忘了把這個也包env了哈哈)
    const bucket = s3.Bucket.fromBucketArn(this,"test","arn:aws:s3:::test")

    // 負責前面呼叫step function 的 lambda
    const downloadAudioLambda = new lambda.Function(this, "downloadAudioLambda", {
      runtime: lambda.Runtime.NODEJS_12_X,
      timeout: cdk.Duration.seconds(25),
      handler: "index.handler",
      code: lambda.Code.fromAsset("lambda/downloadAudioLambda")
    });

    bucket.grantPut(downloadAudioLambda)

    const downloadAudioJob = new tasks.LambdaInvoke(this,'Calllambda',{
      lambdaFunction: downloadAudioLambda,
      outputPath: "$.Payload"
    })

    const map = new stepfunctions.Map(this, 'ExampleMapState');
    map.iterator(downloadAudioJob);

    const logGroup = new logs.LogGroup(this, 'StepFunctionLogs')

    const stateMachine = new stepfunctions.StateMachine(this, 'StateMachine', {
        definition: map,
        logs: {
          destination: logGroup,
          level: stepfunctions.LogLevel.ERROR
        }
    });

    const testVpc = ec2.Vpc.fromLookup(this,"vpc-dev",{
      vpcId: process.env.VPCID
    });

    const processorLambda = new lambda.Function(this, "processorLambda", {
      runtime: lambda.Runtime.NODEJS_12_X,
      handler: "index.handler",
      timeout: cdk.Duration.seconds(25),
      code: lambda.Code.fromAsset("lambda/processor"),
      vpc: testVpc,
      environment: {
        ENDPOINT: process.env.ENDPOINT ?? 'localhost',
        DATABASE: process.env.DATABASE ?? 'db',
        DBUSERNAME: process.env.DBUSERNAME ?? 'root',
        PASSWORD: process.env.PASSWORD ?? 'password',
        NODE_ENV: process.env.NODE_ENV ?? 'test',
        statemachine_arn: stateMachine.stateMachineArn
      }
    });

    stateMachine.grantStartExecution(transferLambda)
  }
}

總之,上面我就是用CDK先創建我的lambda , 然後把那個要放到state machine 的建立”task”, 給予我另外一個lambda 有 startExecution 的權限…. 簡單完成!

二、SAM 的版本

總之,有些原因,我另外又學習怎麼用SAM製作 state machine XDD

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description:
  download audio file from huaxi to trigger audio transcoder
Resources:
  ProcessAudioFileStateMachine:
    Type: AWS::Serverless::StateMachine # More info about State Machine Resource: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html
    Properties:
      DefinitionUri: statemachine/audioFile_processer.json
      DefinitionSubstitutions:
        DownloadAudioFunctionArn: !GetAtt DownloadAudioFunction.Arn
      Policies: # Find out more about SAM policy templates: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html
        - LambdaInvokePolicy:
            FunctionName: !Ref DownloadAudioFunction

  DownloadAudioFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html
    Properties:
      FunctionName: downloadaudio
      CodeUri: functions/downloadaudio/
      Handler: index.handler
      Runtime: nodejs12.x
      Timeout: 20
      Policies:
        - S3ReadPolicy:
            BucketName: 'test'
        - S3WritePolicy:
            BucketName: 'test'

  ProcessorFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: processor
      Timeout: 20
      CodeUri: functions/processor/
      Handler: index.handler
      Runtime: nodejs12.x
      Environment:
        Variables:
          ENDPOINT: db_url
          DATABASE: dbname
          DBUSERNAME: dbusername
          PASSWORD:dbpassword
          NODE_ENV: test
          statemachine_arn: !Ref ProcessAudioFileStateMachine
      Policies:
        - StepFunctionsExecutionPolicy:
            StateMachineName: !GetAtt ProcessAudioFileStateMachine.Name

其實說真的CDK 和 SAM 沒有多大差別,只是CDK你可以用比較程式化的去做那個state machine language (就是sam 裡面要包的那個json 啦!),像我,實在懶得去構想那個json 怎麼寫(啊我就不是JSON工程師啊~),所以先用CDK 產生state machine , 然後上AWS控制台上面把那一串json 抓下來,放到我的sam 這裏… 整理一下,CDK detroy 一下,sam 的template.yaml 調整一下,一個下午搞定啦!(不過我好像忘了在sam 裡面宣吿log 去接state machine 啦 XDDD 之後再研究吧!)

小君曰:還有很多成長的空間

2020AWSDevDay 一日遊

最近請了一天公假,和很多後端組的同事一起參加今年2020 AWS Dev Day, 這是人生的第一次啊!能夠與很多AWS 的開發者聚再一起,實在是件令人興奮的事,以下就簡短、簡單的分享一下吧!

早上的議程

早上其實是共同的議程,有Pahud 大大分享的「與開發者同行」以及Kim 分享的「技術人的社群影響力」,另外也有趨勢科技分享比較硬技術的「如何在 AWS 上建立大規模實時數據管道」,老實說,第三場有點聽不太懂,感覺與現實我遇到的情境真的相差甚遠,所以很難真正理解與明白他所談的一些概念,大概知道要有所「監測」才能有所證明,如果要證明自己做好,就可以用監測/Dashboard 的方式呈現給非技術性的團隊看,這種技巧可以記一下,至於其他技術關鍵字的部分,像是 AWS kinesis , Apache Flink 等等,可能只是稍微查查 wiki 了,看看以後有沒有機會遇到這樣。

至於其他比較軟的部分,大多都是談談「人生」,但我覺得可以記下的是「技術人的社群影響力」這一場,他讓我也重新再思熱情的重要,回想起當初讀資管、寫程式的小初衷。或許明年,可以選擇某個社群認真參加一下、投入一下,一個人可以走的快、但一群人可以走得更遠啊!

而另外我也很想在明年找一個G0V某個專案,好好給他投入一下,貢獻作為技術者的社會影響力!但說真的,還是要給他認真的付諸實踐才是真的!

謝謝在外面擺攤的DDD TW 的社群義工,當我很認真地問起DDD, 甚至問了很多很基礎很初學的問題都還是很不厭其煩地為我解答!說真的之前就大概聽過DDD,就我的理解上是一種軟體開發方法論,可以將業務知識對應到我們的程式的方法,我覺得真的很適合拿來放在我在做產品的工作場域!希望藉由之後認真地給他投入DDD社群的過程中,真正學習、認識、應用與實踐DDD。畢竟,作為工程師,還是希望自己寫一手漂亮、好維護、可傳承的程式碼與產品啊!Be a better Coder ! Also be a better Architect !

在下午的議程中,我先選擇了Track C 的第一場,之後就都待在Track A了…

CDK家族介紹:CDK, CDKTF 及 CDK8S

這場還蠻基礎的,因為先前參加過Pahud 的serverless php 工作坊,稍微認識過了CDK ,而在之後也有時候會看Pahud的Youtube影片學習,最近鐵人賽也有熱心人士分享CDK的學習(目前正在學習中) ,所以這場的知識量對我來說真的有點偏少,但也很不錯了,因為我直接跳過一些基礎或歷史直接學CDK難免還是會有點卡卡的,藉這此議程補足之前沒有補上的歷史與基礎也很不錯,當然啦,我覺得我不太認識Kubernetes也是一個小小的致命問題之一,學好Docker 卻沒有學好 Kubernetes真的有點傷啊! 看來以後要補足這一塊的知識!

運用 AWS Fargate 與 Amazon ECS 的 CI/CD 最佳實踐

這一場談到CICD的最佳實踐,說真的也是有點偏基礎,日常我工作就有在用到了….不過他談到一個Blue/Green 部署的概念可以放在心上,就是讓舊的版本先飛一陣子,只有一部分的人用新的版本,等到新的版本穩定了,再將原本舊的版本拿掉。這樣的好處是如果到時候要從新版本還原很方便(大概我是記得這樣啦XD)。

技術選型,今天要選 ECS Fargate 還是 ECS EC2 launch types

老實說,他其實沒有講什麼,最後也沒有真的大概指名什麼狀況要選Fargate,什麼時候要選Ec2 (之後可能還有ECS anywhere ??) ,大概整場就在講「燒烤店」吧(笑~ 。大過大概知道Fargate就是不太管、而 EC2就是要管理這兩種大差別吧,以及一些你可以選擇的場景XD

數數發 DevOps 的轉型旅程與 AWS CDK 實作案例

其實要導入DevOps 真的不太容易,他是一種「文化」、需要「溝通」、擁抱「改變」,我很佩服國泰金控居然有這這樣的一個中心願意為此而努力、跳下去做!而這場比較有點硬技術且讓我印象深刻的是CDK的撰寫要for function(合) 還是 for resource (分),其實沒有標準答案,帶他們團隊是採取for resource 的方式,另外,template的改變能越少越好,他們是有用一個叫做config.py的方式去載入一些真正會需要調整改變的地方,這帶給我寫code有不錯的技巧與工具啟發!

結論

這場AWS Dev Day , 可能我選的議程都比較基礎比較簡單吧?所以感覺寫起來沒什麼技術點,但我覺得基礎是很重要的!這是我最近進入職場寫程式一直以來所擁有的體會,有時候我們忽略的基礎,剛開始可能會真的沒什麼太大用,但你寫久之後,其實這些正是事後需要補足的地方!無論是本科系或非本科系的都是一樣!

小君曰:結果最後的airpod 沒抽到、然後報到禮和問卷禮都沒拿到,難道我這天只是來吃便當的嗎?

原來可以這麼寫(8): SAM 真的好好玩~

這篇文章有點廢,沒什麼技術點… 純粹是拿部落格當筆記的概念。

玩 AWS SAM

最近在玩AWS SAM CLI 部署 lambda ,真的好好玩喔,最近拿來部署好關於一些資料庫、SQS、KMS 等等的東西… 以下是我花了一點時間研究好怎麼寫template.yaml … 都要變成yaml 工程師拉!


 

更多的Mysql 研究

另外因為某個原因,讓我最近一直在研究database lock 的問題… 原來,加一個[for update]就可以達成了,真的好好玩~


select points from customers for update

資料來源:https://oldmo860617.medium.com/transaction-%E4%BD%B5%E7%99%BC%E9%8C%AF%E8%AA%A4%E8%88%87%E9%9A%94%E9%9B%A2%E5%B1%A4%E7%B4%9A-51b8af6178ae

https://blog.xuite.net/vexed/tech/22289223-%E7%94%A8+SELECT+…+FOR+UPDATE+%E9%81%BF%E5%85%8D+Race+condition

徹底解決Composer 記憶體不夠的問題

再裝某些Composer package 時常常遇到記憶體不足的問題,後來查到一個超棒的指令

COMPOSER_MEMORY_LIMIT=-1 composer update

資料來源:https://medium.com/@kycd.dark/%E5%9F%B7%E8%A1%8C-composer-update-%E6%99%82%E9%81%87%E5%88%B0-composer-memory-limit-aee4f2df56ee

小君曰:「真廢」

原來可以這麼寫(6): 換了一個佈景主題

我換了一個佈景主題,你知道的,後端工程師美感幾乎都不怎麼樣。我覺得我開發的佈景主題好像還是不是很好用、很美… 所以找了一個新的佈景主題,好看多了……

參加 AWS 工作坊

最近有機會上課,課程名稱是:PHP 開發者工作坊 -深入淺出 AWS 無伺服器 LAMP 架構(https://awsphpday.splashthat.com/),引用了外國人寫的一系列文章:https://aws.amazon.com/tw/blogs/compute/introducing-the-new-serverless-lamp-stack/

從這一系列文章,這個人定義出新的LAMP定義: L- Lambda , A- API gateway , M-Mysql , P-PHP。並且介紹如何實作以及實現。

之後滿心期待報名,甚至還報名了三次,兩次用私人信箱、一次用公司信箱。AWS真的有夠現實的,只有公司信箱報名的那個有成功XD 另外也發現原來我們公司的公假這麼好請XD 只要主管有同意就好 哈哈

有機會認識到Pahud 大大,他真的是一個很熱情的人,在會後請教他問題都很熱情地回答哈哈,同時也深入到Bref 這個套件、以及 Pahud 大大開發的套件可以如何方便的部署serverless laravel 在 AWS 上,我真的很期待這門課程也很開心得到很多不錯的收穫,同時也認識到AWS CDK,目前也正以緩慢的速度慢慢理解學習他(畢竟我又不是DevOps 哈哈)……

啊主要這門課程他就是在介紹他開發的這個套件:https://github.com/aws-samples/cdk-serverless-lamp

這個套件主要是依據AWS CDK為基底,做出符合serverless laravel 的contruct lib ,可以很方便的讓開發者使用開箱

AWS SAM CLI & Lambda

同時我的第一個 Lambda 專案終於開發到一個階段了,甚至也經過前輩的Code Review 完!真的很期待他上架的時候,除了是我第一個Nodejs 架上專案也是第一個 Lambda 專案,而且很認真的畫流程圖、一步一步開發規劃。就是可惜目前開發順序&上架就是有點混亂、這也是讓我有點不爽的地方,一直被「中間插件」… 然後等到上架可能又有更多東西要調…那開發者到底為什麼當初要規劃那麼多?幫使用者想那麼多?(不過軟體工程不就是需求常常會改來改去嗎? 真的很好奇更標準更專業的IT他們怎麼處理這一塊?)

同時,這個專案也要慢慢學習與習慣用SAM CLI ,之前我們公司的Lambda 管理與開發比較亂、現在有了SAM之後會比較好整理及有次序,能夠成為公司內導入這部分的其中一份子真的蠻令人興奮的!也希望我的 第一個 Lambda 專案可以趕快上去! 這樣我就又有一個成績可以炫耀(誤

小君曰:最近都在搞AWS呢