💻

AWS CDKでLambda 関数 URL(Function URLs)を作るハンズオンテキストを作った話

2022/05/27に公開

過去AWS CDKを使ってLambda 関数URL(Function URLs)を設定してみた。(L1 Constractで)

AWS CDKを使ってLambda 関数URL(Function URLs)を設定してみた。(L2 Constractで)
という記事を書きましたが、
この記事を書いた縁で、以下の勉強会のハンズオンの講師を依頼されまして、ハンズオンテキストの作成を行いました。
https://awsbasics.connpass.com/event/245650/
※なお、講師については、身内に不幸があり、できませんでした。

作ったハンズオンテキスト

ハンズオンテキストは以下になります。
何人かでハンズオンのテキスト作成ってのはやったことがあるんですが、そこまで難しい内容ではありませんが、一人で作りました。
https://github.com/Kenichiro-Wada/aws-lambda-functions-urls-for-aws-cdk
(あ、functionsになってる 汗)

流れとしては、

  • L1 Constract で作ってみる
  • L2 Constract で作ってみる
    • ここで、APIっぽいものを作成しています。
  • VPC LambdaにFunction Urls設定してみる

となっています。

Stackファイルの中身、Lambda関数のコードは、
Github内のcommand.txtに書いてあるので、そちらをご覧ください。
別途ソースコードとして外出しするかな・・・。

テキスト作成中のこと

ここからは、作った際にハマったこと、あとハンズオン実施の際に発覚したことについて書いていきたいと思います。
実際のところは、すでに作っていたものを流用したので、そこまで苦戦していません。

VPCの設定

CDKでVPCを設定する際、実はこれだけでできます。(L1 Constractで作ってみた際にやってました)

    // VPC
    const lambdaUrlVpc = new ec2.Vpc(this, 'lambdaUrlVpc', {
      cidr : '10.0.0.0/16',
    });

しかし、これだと、NAT Gatewayまで作ってくれます。しかもAZ毎に。
VPCはこうあるべきをきっと示してくれたんだと思います。
でも、自分にはそこまではいらなかった。
そして、作られたのわかってたけど放置したら、こんな事態になりました。
https://twitter.com/Keni_W/status/1521112419728523270

自分でやる分には自己責任になりますが、
ハンズオンで色んな人に作ってもらう際に、
なるべく余計なお金は発生しないようにしないといけませんということで、
APIリファレンスを見ながら、ハンズオン向けに適切に設定してみました。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html

最初は、VPC作って、Subnetを作って、VPCに紐付ける。
って感じで作って、いざ実行してみたら、見事にエラー。
subnetTypeがないからダメよーって言われて、
いや、SubnetのConstructにsubnetTypeなんてプロパティないじゃんって思いつつ、
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Subnet.html

今一度VPCのConstructを見たら、subnetConfigurationプロパティで定義するのね(汗)となり、
こんな感じになりました。

    const vpc = new ec2.Vpc(this, 'LambdaFunctionUrlsVpc', {
      cidr : '10.0.0.0/16',
      defaultInstanceTenancy: DefaultInstanceTenancy.DEFAULT,
      enableDnsSupport: true,
      enableDnsHostnames: true,
      subnetConfiguration: [
        { cidrMask: 24, name: 'PublicSubnet', subnetType: ec2.SubnetType.PUBLIC },
        { cidrMask: 24, name: 'PrivateSubnet', subnetType: ec2.SubnetType.PRIVATE_ISOLATED},
      ]
    });

Subnet、PublicとかPrivateとか区別しないよ的な感じだったと思ったんですが、Typeとして指定したり、Public Subnet ConstructとPrivateSubnet Constructがあるのは面白いなと思った人です。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.PublicSubnet.html
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.PrivateSubnet.html

cdk destory時にDynamoDBのテーブルが削除されない

こちらは、完全にドキュメントをちゃんと読めよという事案だったのですが、
後日、ハンズオン中のツイートを見たら、
最後にリソースを全部削除するために、cdk destory コマンドを実行するのですが、
コマンド実行してもDynamoDBのテーブルが削除されないという話が上がってました。

あれっと思って、
DynamoDBのTable CounstructのremovalPolicyを見てみると、
default: RemovalPolicy.RETAIN と書いてありました。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb.Table.html#removalpolicy
・・・ああ、保持されるのね・・・。削除してくれないのね・・・。
自分のアカウントのDynamoDBのコンソール見たら、何回か試していたので、まあそこそこ残ってましたorz

現在のテキストでは、以下のようにして、削除するようにしています。

    /**
     * DynamoDB
     */
     const keyName:string = 'title';
     const songsTable = new dynamodb.Table(this, 'SongsTable', {
      partitionKey: {
        name: keyName,
        type: dynamodb.AttributeType.STRING,
      },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
      removalPolicy: RemovalPolicy.DESTROY
    });

removalPolicy: RemovalPolicy.DESTROY の部分ですね。

ハンズオンイベントの主催でもあるAWSJ亀田さんが気づいてくれて、コンソールで削除するように案内してくれたみたいなんですが、ちゃんとドキュメント読んで作らないとダメだなーと反省です。

今後

CDKでの構築、一通りは体験できるようになっていますが、

  • IAM認証
  • CORS

はできていない(そもそも試してもいない)ので、
せっかくなので、それができるようにしようかなと思います。
あと、READMEとかも整備しないとな・・・って思ってます。
あとは、これまでのネタ&さらなる検証で、先日発足したJAWS UG CDK支部の勉強会にLTしに行こうかなと思っています。(リンク先は #1)
https://jawsug-cdk.connpass.com/event/246765/

Discussion