2022.07.13 JAWS-UG CDK専門支部 #2登壇資料です。
AWS CDKでLambda Function URLsを設定してみた話BXT KBXTVH KBXTVH@DEL2022.07.13JAWS-UG CDK⽀部 #2和⽥健⼀郎@Keni_W
View Slide
ࠓ͢͜ͱKBXTVHDIJCB KBXTVH@DEL• ⾃⼰紹介• Lambda Function Urlsとは• 私とAWS CDK• まずはL1• 次はL2• ハンズオン作ったよ• やらかし事案紹介"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
⾃⼰紹介⽒名:和⽥ 健⼀郎所属:アイレット株式会社 エンジニアJAWS-UG 千葉 運営メンバーSORACOM UG東京 運営メンバーTwitter: @Keni_W Facebook : kenichiro.wada.3好きなAWSサービス : AWS Lambda2020年共著でサーバーレスの本書きました普段は社内開発で社内のシステム担当
ࢲͱ$%,KBXTVHDIJCB KBXTVH@DEL• 使い始めたのは、昨年10⽉ぐらい(v1)。• 構築中にどんどんバージョンアップされてたので、エラーになってウゲーってなってた⼈。• CloudFormationのテンプレート、CDKのおかげで⼀⽣⼿で書くことはないなと思ってる⼈。"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
-BNCEB'VODUJPOT6SMTͱKBXTVHDIJCB KBXTVH@DEL• 2022年4⽉に登場したAWS Lambda関数に外部エンドポイントを⽣やせるようになったもの。• Lambda単体でAPIエンドポイントを作れるということで、API Gatewayと似て⾮なるものですが、使い分けを確認のこと。• 注意はVPC Lambdaにもサクッと設定できること。"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
·ͣ-KBXTVHDIJCB KBXTVH@DEL• 直前にAWS CDK ConferenceがあったのでCDKでチャレンジ。• 登場当初はL2 Construct 対応されてなかった。• プルリクはあったけど未マージ。• 海外の⽅がSample作ってたのでそれを参考にして作ってみた。"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
·ͣ-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(),});
࣍-KBXTVHDIJCB KBXTVH@DEL• 2022/04/22にL2 Constract対応が盛り込まれたv2.21.0がリリースされました。• なので、早速試してみる• L2対応すると⼤分コード削減されました。"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
࣍-KBXTVHDIJCB KBXTVH@DEL"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ// L2 Constractconst lambdaFunctionUrlsL2 = new lambda.Function(this, 'LambdaFunctionUrlsL2', {runtime: lambda.Runtime.NODEJS_14_X,code: lambda.Code.fromAsset('lambda'), // code loaded from "lambda" directoryhandler: '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,});
࣍-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(),});
࣍-KBXTVHDIJCB KBXTVH@DEL• 権限周りを宜しく作ってくれるのが楽。• API Gatewayと違って、標準ではアウトプットしてくれないので、CfnOutputは必須。• L1でも使えることに気づいて、例ではL1にも⼊ってる。"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
࣍-KBXTVHDIJCB KBXTVH@DEL• API Gatewayと⽐較とかもしたのですが、その辺は以下の記事をご覧いただければと・・・。https://zenn.dev/keni_w/articles/80ff147f0e57f6"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
ϋϯζΦϯ࡞ͬͨΑKBXTVHDIJCB KBXTVH@DEL• L1作ってアウトプットした後、AWSJ⻲⽥さんの勉強会で「特別編 Lambda Function URLs」があり、LT応募したら、紆余曲折を経て、ハンズオンコンテンツ作ることになりました。"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
ϋϯζΦϯ࡞ͬͨΑKBXTVHDIJCB KBXTVH@DEL• ハンズオンの流れは以下• L1 Constructで作る• この時点でL2出てたけども• L2 Constructで作る• DynamoDB配置してAPI的にもした• VPC LambdaにFunction Urls設定してみる"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
ϋϯζΦϯ࡞ͬͨΑKBXTVHDIJCB KBXTVH@DEL• 今も公開中なので、興味がある⽅はぜひ。https://github.com/Kenichiro-Wada/aws-lambda-functions-urls-for-aws-cdk"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
ϋϯζΦϯ࡞ͬͨΑKBXTVHDIJCB KBXTVH@DEL予告"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
ϋϯζΦϯ࡞ͬͨΑKBXTVHDIJCB KBXTVH@DEL近⽇アップデート予定"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
ϋϯζΦϯ࡞ͬͨΑ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Λઃఆͯ͠Έͨ
Β͔͠ࣄҊհKBXTVHDIJCB KBXTVH@DEL• VPC作成には気をつけよう• リソースの削除のデフォルトはちゃんとみましょう"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
Β͔͠ࣄҊհKBXTVHDIJCB KBXTVH@DEL• VPC作成はこれだけでできます。• ただし、これだけだと、以下を作ってくれます。 (ap-northeast-1)• PrivateなSubnet x 2• PublicなSubnet x2• NAT Gateway x2"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ// VPCconst lambdaUrlVpc = new ec2.Vpc(this, 'lambdaUrlVpc‘, {cidr : '10.0.0.0/16',});
Β͔͠ࣄҊհKBXTVHDIJCB KBXTVH@DELNAT Gateway x2"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
Β͔͠ࣄҊհKBXTVHDIJCB KBXTVH@DEL"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨそして、消し忘れた結果こうなりました。• みなさんはVPC⼿抜きをせずに、ちゃんと設計して作りましょうね。
Β͔͠ࣄҊհKBXTVHDIJCB KBXTVH@DEL• ハンズオンの⽇のツイートなどを眺めてみると、こんなコメントが・・・。"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
Β͔͠ࣄҊհKBXTVHDIJCB KBXTVH@DELDynamoDB削除されない???"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ
Β͔͠ࣄҊհKBXTVHDIJCB KBXTVH@DEL"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨデフォルトでは消してくれないんかい・・・。https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb.Table.html#removalpolicy
Β͔͠ࣄҊհ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});
ऴΘΓKBXTVHDIJCB KBXTVH@DEL"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨ• Lambda Function Urls コンソールでも簡単だけど、CDKでもL2なら結構簡単。• 簡単に作って、壊せるけど、削除されないものもあるし、何が作られるかは、cdkdiffでちゃんと確認すること。• Stackの分け⽅とかまだまだ雰囲気でやってるので、さらに勉強したいと思ってる。
ऴΘΓKBXTVHDIJCB KBXTVH@DEL"84$%,Ͱ-BNCEB'VODUJPO63-TΛઃఆͯ͠Έͨご静聴ありがとうございました