0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

aws lambda を serverless-offline で実行した際のエラーを ChatGPT に調べさせたら秒で解決した

Last updated at Posted at 2023-04-18

つい、いましがたの話

  • 既にデプロイ済みのaws lambda関数(Node.js)をserverless offline でローカル起動してみようとしたところ、ローカルサーバーの構築でエラーが発生しました。
  • そういえばserverless offlineは、albが未サポートだったな〜と思ったのですが、これをChatGPTが特定できるのか試してみました。

プロンプト

Q. 既存の aws Lambda のプログラムを severless offline で実行すると、HttpServer.createRoutes でエラーが発生します。
原因を推測してください。

下記は serverless.yml の内容の抜粋です。

functions:
  api:
    handler: handler.api
    events:
        - alb:
            listenerArn:
                Ref: ${self:custom.listers.${opt:stage, self:custom.defaultStage}}
            priority: 1
            targetGroupName: ${self:custom.targets.${opt:stage, self:custom.defaultStage}}
            conditions:
                host: ${self:custom.hosts.${opt:stage, self:custom.defaultStage}}
                path: /*

回答

A. serverless-offlineプラグインはAWS Lambda関数をローカルで実行し、API Gatewayのシミュレーションを提供しますが、serverless.ymlファイルにあるalbイベントをサポートしていません。そのため、HttpServer.createRoutesでエラーが発生している可能性が高いです。

解決策として、serverless.ymlでhttpイベントを使用することをお勧めします。これにより、serverless-offlineプラグインはローカル環境での実行に適切なルーティングを作成できます。

serverless.ymlのfunctions.api.eventsを以下のように修正してみてください:

functions:
  api:
    handler: handler.api
    events:
      - http:
          path: /
          method: ANY
          cors: true

この変更により、すべてのHTTPメソッドに対応するルートが作成されます。ただし、本番環境でALBを使用する場合は、デプロイ時にhttpイベントをalbイベントに戻す必要があります。これは環境変数やステージに基づく条件付き設定を使用して行うことができます。


フォローの内容も完璧です。
このまま、条件付き設定についても追いプロンプトを投げていけば良さそうです。

追いプロンプト

Q. --stage オプションを使った条件付き設定を作成してください。
prod は本番環境
stg はステージング環境
local はローカル環境とします。

回答

A. serverless.ymlファイル内で--stageオプションに基づく条件付き設定を作成するために、以下のように変更してみてください。

まず、functions.api.eventsの定義を削除します。

次に、serverless.ymlの最後に次のカスタムセクションを追加します:

custom:
  ...
  eventSettings:
    prod:
      - alb:
          listenerArn:
            Ref: ${self:custom.listers.prod}
          priority: 1
          targetGroupName: ${self:custom.targets.prod}
          conditions:
            host: ${self:custom.hosts.prod}
            path: /*
    stg:
      - alb:
          listenerArn:
            Ref: ${self:custom.listers.stg}
          priority: 1
          targetGroupName: ${self:custom.targets.stg}
          conditions:
            host: ${self:custom.hosts.stg}
            path: /*
    local:
      - http:
          path: /
          method: ANY
          cors: true

これにより、各環境に対して異なるイベント設定が定義されます。

最後に、functions.api.eventsを以下のように更新して、カスタムイベント設定を使用します。

functions:
  api:
    handler: handler.api
    events: ${self:custom.eventSettings.${opt:stage, self:custom.defaultStage}}
    ...

これで、--stageオプションに基づいて、適切なイベント設定が選択されます。prodとstgステージでは、ALBイベントが使用され、localステージではHTTPイベントが使用されます。この方法で、他の環境にも独自のイベント設定を追加できます。


完璧です。
新人の頃、こんな先輩に教わりたかったとすら思います。

所感

ChatGPTにプログラミングをさせる記事をよく見るのですが、
複雑な要件や条件を正確に伝えて、かつ精度の高いプログラムが生成されるようなプロンプトの作成は、むしろ難儀な気がします。

それに比べてインフラやCI/CDなどの設定ファイルは、比較的シンプルな要件でもそれなりに手数がかかるものです。
これらの構築にChatGPTを利用する方が「現時点では」業務の効率化に効くのではないかと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?