Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS CDKでLambda Function URLsを設定してみた話/jawsug-cdk-2

AWS CDKでLambda Function URLsを設定してみた話/jawsug-cdk-2

2022.07.13 JAWS-UG CDK専門支部 #2登壇資料です。

Kenichiro Wada

July 13, 2022
Tweet

More Decks by Kenichiro Wada

Other Decks in Technology

Transcript

  1. AWS CDKでLambda Function URLs
    を設定してみた話
    BXT KBXTVH KBXTVH@DEL
    2022.07.13
    JAWS-UG CDK⽀部 #2
    和⽥健⼀郎@Keni_W

    View Slide

  2. ࠓ೔࿩͢͜ͱ
    KBXTVHDIJCB KBXTVH@DEL
    • ⾃⼰紹介
    • Lambda Function Urlsとは
    • 私とAWS CDK
    • まずはL1
    • 次はL2
    • ハンズオン作ったよ
    • やらかし事案紹介
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  3. ⾃⼰紹介
    ⽒名:和⽥ 健⼀郎
    所属:アイレット株式会社 エンジニア
    JAWS-UG 千葉 運営メンバー
    SORACOM UG東京 運営メンバー
    Twitter: @Keni_W Facebook : kenichiro.wada.3
    好きなAWSサービス : AWS Lambda
    2020年共著でサーバーレスの本書きました
    普段は社内開発で社内のシステム担当

    View Slide

  4. ࢲͱ$%,
    KBXTVHDIJCB KBXTVH@DEL
    • 使い始めたのは、昨年10⽉ぐらい(v1)。
    • 構築中にどんどんバージョンアップされてた
    ので、エラーになってウゲーってなってた⼈。
    • CloudFormationのテンプレート、CDKのお
    かげで⼀⽣⼿で書くことはないなと思ってる
    ⼈。
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  5. -BNCEB'VODUJPOT6SMTͱ͸
    KBXTVHDIJCB KBXTVH@DEL
    • 2022年4⽉に登場したAWS Lambda関数に
    外部エンドポイントを⽣やせるようになっ
    たもの。
    • Lambda単体でAPIエンドポイントを作れ
    るということで、API Gatewayと似て⾮な
    るものですが、使い分けを確認のこと。
    • 注意はVPC Lambdaにもサクッと設定でき
    ること。
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  6. ·ͣ͸-
    KBXTVHDIJCB KBXTVH@DEL
    • 直前にAWS CDK Conferenceがあったの
    でCDKでチャレンジ。
    • 登場当初はL2 Construct 対応されてな
    かった。
    • プルリクはあったけど未マージ。
    • 海外の⽅がSample作ってたのでそれを参
    考にして作ってみた。
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  7. ·ͣ͸-
    KBXTVHDIJCB KBXTVH@DEL
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    /**
    * Lambda Url
    * Referenced https://github.com/neilkuan/cdk-lambda-url-sample
    * See https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html
    */
    new CfnResource(this, 'lambdaFunctionUrlsL1Permision', {
    type: 'AWS::Lambda::Permission’,
    properties: {
    FunctionName: lambdaFunctionUrlsL1.functionName,
    Principal: '*’,
    Action: 'lambda:InvokeFunctionUrl’,
    FunctionUrlAuthType: 'NONE’
    }
    });
    const lambdaFunctionUrlsL1Cfn = new CfnResource(this, 'LambdaFunctionUrlsL1Cfn' , {
    type: 'AWS::Lambda::Url’,
    properties: {
    TargetFunctionArn: lambdaFunctionUrlsL1.functionArn,
    AuthType: 'NONE’
    }
    });
    new CfnOutput(this, 'TheLambdaUrlFunctionL1', {
    value: lambdaFunctionUrlsL1Cfn.getAtt('FunctionUrl').toString(),
    });

    View Slide

  8. ࣍͸-
    KBXTVHDIJCB KBXTVH@DEL
    • 2022/04/22にL2 Constract対応が盛り込
    まれたv2.21.0がリリースされました。
    • なので、早速試してみる
    • L2対応すると⼤分コード削減されました。
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  9. ࣍͸-
    KBXTVHDIJCB KBXTVH@DEL
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    // L2 Constract
    const lambdaFunctionUrlsL2 = new lambda.Function(this, 'LambdaFunctionUrlsL2', {
    runtime: lambda.Runtime.NODEJS_14_X,
    code: lambda.Code.fromAsset('lambda'), // code loaded from "lambda" directory
    handler: 'index.handler’,
    timeout: Duration.seconds(10),
    });
    const lambdaFunctionUrlsL2Url = new lambda.FunctionUrl(this,'LambdaFunctionUrlsL2Url', {
    function: lambdaFunctionUrlsL2,
    authType: lambda.FunctionUrlAuthType.NONE
    });
    new CfnOutput(this, 'TheLambdaFunctionUrlsL2Url', {
    value: lambdaFunctionUrlsL2Url.url,
    });

    View Slide

  10. ࣍͸-
    KBXTVHDIJCB KBXTVH@DEL
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    /**
    * Lambda Url
    * Referenced https://github.com/neilkuan/cdk-lambda-url-sample
    * See https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html
    */
    new CfnResource(this, 'lambdaFunctionUrlsL1Permision', {
    type: 'AWS::Lambda::Permission’,
    properties: {
    FunctionName: lambdaFunctionUrlsL1.functionName,
    Principal: '*’,
    Action: 'lambda:InvokeFunctionUrl’,
    FunctionUrlAuthType: 'NONE’
    }
    });
    const lambdaFunctionUrlsL1Cfn = new CfnResource(this, 'LambdaFunctionUrlsL1Cfn' , {
    type: 'AWS::Lambda::Url’,
    properties: {
    TargetFunctionArn: lambdaFunctionUrlsL1.functionArn,
    AuthType: 'NONE’
    }
    });
    new CfnOutput(this, 'TheLambdaUrlFunctionL1', {
    value: lambdaFunctionUrlsL1Cfn.getAtt('FunctionUrl').toString(),
    });

    View Slide

  11. ࣍͸-
    KBXTVHDIJCB KBXTVH@DEL
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    // L2 Constract
    const lambdaFunctionUrlsL2 = new lambda.Function(this, 'LambdaFunctionUrlsL2', {
    runtime: lambda.Runtime.NODEJS_14_X,
    code: lambda.Code.fromAsset('lambda'), // code loaded from "lambda" directory
    handler: 'index.handler’,
    timeout: Duration.seconds(10),
    });
    const lambdaFunctionUrlsL2Url = new lambda.FunctionUrl(this,'LambdaFunctionUrlsL2Url', {
    function: lambdaFunctionUrlsL2,
    authType: lambda.FunctionUrlAuthType.NONE
    });
    new CfnOutput(this, 'TheLambdaFunctionUrlsL2Url', {
    value: lambdaFunctionUrlsL2Url.url,
    });

    View Slide

  12. ࣍͸-
    KBXTVHDIJCB KBXTVH@DEL
    • 権限周りを宜しく作ってくれるのが楽。
    • API Gatewayと違って、標準ではアウト
    プットしてくれないので、CfnOutputは必
    須。
    • L1でも使えることに気づいて、例ではL1
    にも⼊ってる。
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  13. ࣍͸-
    KBXTVHDIJCB KBXTVH@DEL
    • API Gatewayと⽐較とかもしたのですが、
    その辺は以下の記事をご覧いただければ
    と・・・。
    https://zenn.dev/keni_w/articles/80ff147f0e57f6
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  14. ϋϯζΦϯ࡞ͬͨΑ
    KBXTVHDIJCB KBXTVH@DEL
    • L1作ってアウトプットした後、
    AWSJ⻲⽥さんの勉強会で
    「特別編 Lambda Function URLs」があ
    り、LT応募したら、紆余曲折を経て、ハン
    ズオンコンテンツ作ることになりました。
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  15. ϋϯζΦϯ࡞ͬͨΑ
    KBXTVHDIJCB KBXTVH@DEL
    • ハンズオンの流れは以下
    • L1 Constructで作る
    • この時点でL2出てたけども
    • L2 Constructで作る
    • DynamoDB配置してAPI的にもした
    • VPC LambdaにFunction Urls設定して
    みる
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  16. ϋϯζΦϯ࡞ͬͨΑ
    KBXTVHDIJCB KBXTVH@DEL
    • 今も公開中なので、興味がある⽅はぜひ。
    https://github.com/Kenichiro-Wada/aws-lambda-functions-urls-for-aws-cdk
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  17. ϋϯζΦϯ࡞ͬͨΑ
    KBXTVHDIJCB KBXTVH@DEL
    予告
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  18. ϋϯζΦϯ࡞ͬͨΑ
    KBXTVHDIJCB KBXTVH@DEL
    近⽇アップデート予定
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  19. ϋϯζΦϯ࡞ͬͨΑ
    KBXTVHDIJCB KBXTVH@DEL
    • AWS Serverless Heroでもある吉⽥真吾さ
    んが builders.flashに同様の投稿されてい
    て、こちらの⽅が解説込みで書かれている
    ので、おすすめだったりします。
    https://aws.amazon.com/jp/builders-flash/202206/operate-lambda-function-request-data
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  20. ΍Β͔͠ࣄҊ঺հ
    KBXTVHDIJCB KBXTVH@DEL
    • VPC作成には気をつけよう
    • リソースの削除のデフォルトはちゃんとみ
    ましょう
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  21. ΍Β͔͠ࣄҊ঺հ
    KBXTVHDIJCB KBXTVH@DEL
    • VPC作成はこれだけでできます。
    • ただし、これだけだと、以下を作ってくれ
    ます。 (ap-northeast-1)
    • PrivateなSubnet x 2
    • PublicなSubnet x2
    • NAT Gateway x2
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    // VPC
    const lambdaUrlVpc = new ec2.Vpc(this, 'lambdaUrlVpc‘, {
    cidr : '10.0.0.0/16',
    });

    View Slide

  22. ΍Β͔͠ࣄҊ঺հ
    KBXTVHDIJCB KBXTVH@DEL
    NAT Gateway x2
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  23. ΍Β͔͠ࣄҊ঺հ
    KBXTVHDIJCB KBXTVH@DEL
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    そして、消し忘れた結果こうなりました。
    • みなさんはVPC⼿抜きをせずに、ちゃんと
    設計して作りましょうね。

    View Slide

  24. ΍Β͔͠ࣄҊ঺հ
    KBXTVHDIJCB KBXTVH@DEL
    • ハンズオンの⽇のツイートなどを眺めてみ
    ると、こんなコメントが・・・。
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  25. ΍Β͔͠ࣄҊ঺հ
    KBXTVHDIJCB KBXTVH@DEL
    DynamoDB
    削除されない???
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩

    View Slide

  26. ΍Β͔͠ࣄҊ঺հ
    KBXTVHDIJCB KBXTVH@DEL
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    デフォルトでは
    消してくれないんかい・・・。
    https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb.Table.html#removalpolicy

    View Slide

  27. ΍Β͔͠ࣄҊ঺հ
    KBXTVHDIJCB KBXTVH@DEL
    • ドキュメントはちゃんと読みましょう。
    • ちなみに、他だとこんな感じ。
    • S3 : 「The bucket will be orphaned」
    • RDS : Snapshot
    • DocumentDB : Retain
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    const songsTable = new dynamodb.Table(this, 'SongsTable', {
    partitionKey: {
    name: keyName,
    type: dynamodb.AttributeType.STRING,
    },
    billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
    removalPolicy: RemovalPolicy.DESTROY
    });

    View Slide

  28. ऴΘΓ
    KBXTVHDIJCB KBXTVH@DEL
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    • Lambda Function Urls コンソールでも簡
    単だけど、CDKでもL2なら結構簡単。
    • 簡単に作って、壊せるけど、削除されない
    ものもあるし、何が作られるかは、cdk
    diffでちゃんと確認すること。
    • Stackの分け⽅とかまだまだ雰囲気でやっ
    てるので、さらに勉強したいと思ってる。

    View Slide

  29. ऴΘΓ
    KBXTVHDIJCB KBXTVH@DEL
    "84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ࿩
    ご静聴
    ありがとう
    ございました

    View Slide