AWS CDK Workshop中に起こるエラーの解消方法~CDK APIレファレンスの読み取り方~

Agaroot IT Partners(AITP)のtomoです。

前回の記事において敢えて未記載にした、AWS CDK Workshop中に起こるエラー(AWS SDKを使用する設定がされていないことにより、Runtime.ImportModuleError: Error: Cannot find module 'aws-sdk'というエラーが生じる件)を解消するためにLambda関数へのレイヤー追加を行う方法を紹介します。

CDKのAPIレファレンスを読み取りながら実装していく流れも紹介しますので、レファレンスを読み取る方法を知りたい方もぜひご一読ください。

いきなりですが結論

前回の記事にて紹介した通りAWS SDKのレイヤーを作成した後、下記の通りに実装を変えてください。

this.handler = new Function(this, "HitCounterHandler", {
  runtime: Runtime.NODEJS_18_X,
  handler: "hitcounter.handler",
  code: Code.fromAsset("lambda"),
  environment: {
    DOWNSTREAM_FUNCTION_NAME: props.downstream.functionName,
    HITS_TABLE_NAME: table.tableName,
  },
  // layersの指定を追加
  layers: [
    lambda.LayerVersion.fromLayerVersionArn(
      this,
      "AwsSdkLayer",
      "{作成したレイヤーのARN}",
    ),
  ],
});

レファレンスを読み取って実装していく流れ

ここからはCDKのAPIレファレンスを読み取りながら、上記実装を行なっていく流れを紹介します。

実現したいことを確認する

まずは実装を通して何をしたいのか整理していきます。今回はCDKで定義中のLambda関数にレイヤーを追加し、Lambda関数内でAWS SDKを使用できるようにしたいのでした。

変更を行うコンストラクトのレファレンスを参照する

変更を行いたいコンストラクトのレファレンスページを開きます。今回変更を行うコンストラクトはlambda.Functionなので、参照すべきページはaws_lambda > Functionとなります。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.Function.html

コンストラクトについて行いたい操作に応じて参照すべき箇所が異なる

参照すべき箇所は、コンストラクトについてどのような操作を行いたいのかによって変わります。よくあるケースとしては下記のようになるでしょう。

  • CDKソースによってリソースを新規生成する場合: Initializerや引数として渡すプロパティが記述されたConstruct Props
  • 既存リソースの情報をコンストラクトとして取得する場合: from~とついた静的メソッド
  • リソースの属性を取得する: Properties
  • リソースに対して操作を行う(他リソースからのアクセスを許可するためのIAMポリシーを作成する、属性を変更するなど): Methods

今回はCDKソースによってリソースを新規生成する中でレイヤーを追加するので、Construct Propsを参照しましょう。実際にConstruct Propsを見てみると、正にレイヤーを追加するためのlayersというプロパティが見つかります。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.Function.html#layers

プロパティに指定されたインタフェースを実装する

プロパティの型はILayerVersion[]とのことなので、ILayerVersionのレファレンスを参照します。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.ILayerVersion.html

すると、このインタフェースを実装するには、

  • 新規生成したい場合: LayerVersionなどを新規生成する
  • 既存リソースを取得したい場合: LayerVersion.fromLayerVersionArn()LayerVersion.fromLayerVersionAttributes()などを利用する

と記載があります。

Implemented by LayerVersionAwsCliLayerKubectlLayerNodeProxyAgentLayerPythonLayerVersion

Obtainable from LayerVersion.fromLayerVersionArn()LayerVersion.fromLayerVersionAttributes()

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.ILayerVersion.html

今回は既に作成したレイヤーを取得したいので、LayerVersion.fromLayerVersionArn()LayerVersion.fromLayerVersionAttributes()のレファレンスなどを参照していきましょう。

どうやらLayerVersion.fromLayerVersionArn()の方は新規生成時にも必要なコンストラクトやIDの指定の他、(メソッド名の通り)ARNの指定さえあればいいようです。今回はこちらを試してみます。

ちなみにLayerVersion.fromLayerVersionAttributes()の方でも基本的にはARNの指定だけでいいらしいですが、他のコンストラクトのfromAttributesメソッドは多くのプロパティを指定する必要があることが多い傾向にあります。詳しくは下記記事の「L2 の from メソッド」をご参照ください。

https://www.ogis-ri.co.jp/otc/hiroba/technical/cdk-concepts/part5.html

さて、こうした流れレイヤーの取得方法およびLambda関数への追加の仕方を確認した結果、ワークショップで記載されているコードに実装を追加して、上記で示した実装に行き着きます🎉

まとめ

いかがだったでしょうか。CDKに限った話ではないかと思いますが、実装していく中でレファレンス参照は不可欠なものになるかと思います。

レファレンスの読み取りに困ることがあった場合、本記事が参考になれば幸いです。

関連するタグ