見出し画像

AWSの基礎を学ぼう「特別編 Lambda Function URLs」に参加したよ #awsbasics

TL;DR

こちらの勉強会に参加しました

Lambda Function URLsとは

今日はこちらのハンズオンです

まずはマネジメントコンソールの画面をポチポチして、Function URLsを利用した関数の作成をして頂きました。
これ数分でできる!
こちらは、過去に試したときのブログで、細かい手順は書いてあります。認証無しでブラウザから関数を実行するだけだったら、これで十分。

ハンズオン

ハンズオンの手順書は @Keni_W さんが作成してくれました。以下、細かい手順やコマンドは省略してますので、試してみたい方はぜひこちらの手順書を元にやってみてください。

環境構築

Cloud9インスタンスを作成します
インスタンスは t3.small を指定
VPCはデフォルト

Cloud9が起動できたら、CDKのバージョンを確認します。ハンズオン前日に新しいCDKのバージョン(2.24.1)が出たらしいのですが、私の環境では2.22.0だったので、一つ古いバージョンっぽいですね。結局手順の中で

## CDKのバージョン確認
$ cdk --version
2.22.0 (build 1db4b16)

## jqをyum install
$ sudo yum -y install jq

## CDKを初期化
$ mkdir lambda-function-urls-cdk
$ cd lambda-function-urls-cdk/
$ cdk init app --language typescript 

## ↓のメッセージが出たので、CDKをバージョンアップしました
****************************************************
*** Newer version of CDK is available [2.24.1]   ***
*** Upgrade recommended (npm install -g aws-cdk) ***
****************************************************

# CDKをバージョンアップ
$ npm install -g aws-cdk # これでエラーになったので、 "--force" をつけてエラーが取れた

# TypeScriptで作成したLambda関数のプログラムを、を即時にjavascriptへ変換するために、以下のコマンドを実行
$ npm run watch

L1 Construct

CDKはConstructと呼ばれる、AWSリソースを抽象化したコンポーネントを集めた、Construct Libraryを持っています。L1 Constructは、CloudFormationのリソースをそのまま利用するものです。まずはL1 Constructで環境を構成して、関数のデプロイをしてみます。

まずは、Cloud9上でCDKのスタックと、実際に動かしたいLambda関数を作成します。以下のコマンドは一通り関数を作成し終わってから実行します。

# CFn テンプレートを作成
$ cdk synth

# CDKをデプロイする前処理を実行
$ cdk bootstrap
 ✅  Environment aws://XXXXXXXXXX/ap-northeast-3 bootstrapped.

# CDKリソースをデプロイ
$ cdk deploy

これでデプロイできました。動作確認してみます。

$ curl https://kcmxqoahp57nisrmurpmdwg2xm0pakun.lambda-url.ap-northeast-3.on.aws/ | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    54  100    54    0     0    193      0 --:--:-- --:--:-- --:--:--   194
"Hello from Lambda Functions Urls! you request is GET"

L2 Construct

今度は一つ抽象度を上げて、L2 Constructで作成してみます
CDKのスタックを書き換えてから、再度cdk deployを実行しました

~ 中略 ~
    // 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,
    });
~ 以下略 ~
# DIFFをとる
$ cdk diff

# 再度デプロイを実行
$ cdk deploy

さてもう一度動作確認。POSTされました!

$ curl -X POST -H "Content-Type: application/json" -d '{"Key":"aaaa", "Value":"bbb"}'  https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    84  100    55  100    29    519    273 --:--:-- --:--:-- --:--:--   800
"Hello from Lambda Functions Urls! you request is POST"

POSTできるAPIを作成する

さて、ここまで作ったCDKのスタックとLambda関数をアップデートして、POSTの検証をしてみましょう。
CDKのスタックを三度書き換えて、デプロイします。DynamoDBが生えました。

Resources
[+] AWS::DynamoDB::Table SongsTable SongsTableXXXXX

データをPOSTして遊んでみます。

## POSTして、POSTして、POST
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"DEEP FOREST", "artist":"DAI"}' https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    58  100    19  100    39     16     33  0:00:01  0:00:01 --:--:--    50
"Put Item Success."
 
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"TRUE SONG", "artist":"DAI"}'  https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    56  100    19  100    37     44     86 --:--:-- --:--:-- --:--:--   130
"Put Item Success."
 
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"GATE OF HEAVEN", "artist":"DAI"}'  https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    61  100    19  100    42    264    584 --:--:-- --:--:-- --:--:--   859
"Put Item Success."

## POSTしたデータを見てみます
$ curl https://llva42x7jza4fdr3j6eillkrby0bojoe.lambda-url.ap-northeast-3.on.aws/ | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   119  100   119    0     0   1059      0 --:--:-- --:--:-- --:--:--  1062
[
  {
    "artist": "DAI",
    "title": "GATE OF HEAVEN"
  },
  {
    "artist": "DAI",
    "title": "DEEP FOREST"
  },
  {
    "artist": "DAI",
    "title": "TRUE SONG"
  }
]

VPC LambdaにFunction URLsを設定する

VPC内でLambda関数を動かしている方も大勢いらっしゃるでしょう、ということで、こやつにFunction URLsを設定してみます。

CDKのスタックを更新します。VPCが生まれて、VPC Lambdaが作られました!

Resources
[+] AWS::EC2::VPC LambdaFunctionUrlsVpc LambdaFunctionUrlsVpcXXX 
[+] AWS::EC2::Subnet LambdaFunctionUrlsVpc/PublicSubnetSubnet1/Subnet LambdaFunctionUrlsVpcPublicSubnetSubnet1SubnetXXXXX
[+] AWS::EC2::RouteTable LambdaFunctionUrlsVpc/PublicSubnetSubnet1/RouteTable LambdaFunctionUrlsVpcPublicSubnetSubnet1RouteTableFXXX
[+] AWS::EC2::SubnetRouteTableAssociation LambdaFunctionUrlsVpc/PublicSubnetSubnet1/RouteTableAssociation LambdaFunctionUrlsVpcPublicSubnetSubnet1RouteTableAssociationXXX
[+] AWS::EC2::Route LambdaFunctionUrlsVpc/PublicSubnetSubnet1/DefaultRoute LambdaFunctionUrlsVpcPublicSubnetSubnet1DefaultRouteXXXXX
[+] AWS::EC2::Subnet LambdaFunctionUrlsVpc/PublicSubnetSubnet2/Subnet LambdaFunctionUrlsVpcPublicSubnetSubnet2SubnetXXXXXX
[+] AWS::EC2::RouteTable LambdaFunctionUrlsVpc/PublicSubnetSubnet2/RouteTable LambdaFunctionUrlsVpcPublicSubnetSubnet2RouteTableXXXXXX
[+] AWS::EC2::SubnetRouteTableAssociation LambdaFunctionUrlsVpc/PublicSubnetSubnet2/RouteTableAssociation LambdaFunctionUrlsVpcPublicSubnetSubnet2RouteTableAssociationXXXX
[+] AWS::EC2::Route LambdaFunctionUrlsVpc/PublicSubnetSubnet2/DefaultRoute LambdaFunctionUrlsVpcPublicSubnetSubnet2DefaultRouteXX
[+] AWS::EC2::Subnet LambdaFunctionUrlsVpc/PrivateSubnetSubnet1/Subnet LambdaFunctionUrlsVpcPrivateSubnetSubnet1Subnet7XXXX
[+] AWS::EC2::RouteTable LambdaFunctionUrlsVpc/PrivateSubnetSubnet1/RouteTable LambdaFunctionUrlsVpcPrivateSubnetSubnet1RouteTableXXXXX
[+] AWS::EC2::SubnetRouteTableAssociation LambdaFunctionUrlsVpc/PrivateSubnetSubnet1/RouteTableAssociation LambdaFunctionUrlsVpcPrivateSubnetSubnet1RouteTableAssociationXXX
[+] AWS::EC2::Subnet LambdaFunctionUrlsVpc/PrivateSubnetSubnet2/Subnet LambdaFunctionUrlsVpcPrivateSubnetSubnet2SubnetXXXX
[+] AWS::EC2::RouteTable LambdaFunctionUrlsVpc/PrivateSubnetSubnet2/RouteTable LambdaFunctionUrlsVpcPrivateSubnetSubnet2RouteTableXXXXX
[+] AWS::EC2::SubnetRouteTableAssociation LambdaFunctionUrlsVpc/PrivateSubnetSubnet2/RouteTableAssociation LambdaFunctionUrlsVpcPrivateSubnetSubnet2RouteTableAssociationEXXXX 
[+] AWS::EC2::InternetGateway LambdaFunctionUrlsVpc/IGW LambdaFunctionUrlsVpcXXX
[+] AWS::EC2::VPCGatewayAttachment LambdaFunctionUrlsVpc/VPCGW LambdaFunctionUrlsVpcVPCXX
[+] AWS::IAM::Role LambdaFunctionUrlsForVpc/ServiceRole LambdaFunctionUrlsForVpcServiceRoleXXX
[+] AWS::EC2::SecurityGroup LambdaFunctionUrlsForVpc/SecurityGroup LambdaFunctionUrlsForVpcSecurityGroupXX
[+] AWS::Lambda::Function LambdaFunctionUrlsForVpc LambdaFunctionUrlsForVpc36929F3F 
[+] AWS::Lambda::Permission LambdaFunctionUrlsForVpc/invoke-function-url LambdaFunctionUrlsForVpcinvokefunctionurlXXXX
[+] AWS::Lambda::Url LambdaFunctionUrlsVpcUrl LambdaFunctionUrlsVpcUrlXXX

CDKをデプロイしてから、動作確認しましょう

$ curl -X POST -H "Content-Type: application/json" -d '{"Key":"aaaa", "Value":"bbb"}' https://rnyv7okl37l7djvjjzybnv47ky0pzray.lambda-url.ap-northeast-3.on.aws/ | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    84  100    55  100    29    114     60 --:--:-- --:--:-- --:--:--   174
"Hello from Lambda Functions Urls! you request is POST"

お片付け

来たときよりも美しく。ハンズオンで作成したスタックをそのままにすると課金されちゃうので、キレイキレイしましょう。

## CDKスタックをキレイサッパリ削除
$ cdk destroy

まとめ

前回、マネジメントコンソールからポチポチして試したときは、Hello Worldを試しただけだったのですが、今回はCDKを使って、Lambda関数に加えて、DynamoDB、VPC、VPC Lambdaも作成しました。
とりあえず手順書通りにやってみて動くことが確認できてから、(特にCDKスタックの)ソースコードを読み込むことで、何をやってたのかがキャッチアップできるかと思います。

それでは。また。

この記事が気に入ったらサポートをしてみませんか?