質問編集履歴

2 追記

rapsody

rapsody score 7

2021/05/08 17:16  投稿

API Gatewayに紐付けたLambda関数をローカルでデバッグしたい。
# 解決したいこと
下記のAPI Gatewayに紐付けたプログラム(Lambda関数)をローカルでデバッグしたいです。
最も簡単にできる方法があれば教えていただきたいです。
プログラム内容としては、APIGatewayのプロキシリクエストが来ると、DynamoDBのテーブルにアクセスして、itemを取得して返却するというものです。  
 
当方、GoやAWSを触り始めたばかりの初心者のため、一つずつしっかりと学んでいきたいと思っています。
わかりやすく説明していただけると幸いです。
よろしくお願い致します。
```Go
package main
import (
   "encoding/json"
   "github.com/aws/aws-lambda-go/events"
   "github.com/aws/aws-lambda-go/lambda"
   "github.com/aws/aws-sdk-go/aws"
   "github.com/aws/aws-sdk-go/aws/session"
   "github.com/aws/aws-sdk-go/service/dynamodb"
   "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)
// Item DBに入れるデータ
type Item struct {
   UserID     int   `dynamodbav:"user_id" json:user_id`
   CreatedTime string `dynamodbav:"created_time" json:created_time`
}
// Response Lambdaが返答するデータ
type Response struct {
   RequestMethod string `json:RequestMethod`
   Result       Item  `json:Result`
}
func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
   method := request.HTTPMethod
   pathparam := request.PathParameters["userid"]
   // DB接続
   sess, err := session.NewSession()
   if err != nil {
       return events.APIGatewayProxyResponse{
           Body:      err.Error(),
           StatusCode: 500,
       }, err
   }
   db := dynamodb.New(sess)
   // 検索条件を用意
   getParam := &dynamodb.GetItemInput{
       TableName: aws.String("tablename"),
       Key: map[string]*dynamodb.AttributeValue{
           "user_id": {
               N: aws.String(pathparam),
           },
       },
   }
   // 検索
   result, err := db.GetItem(getParam)
   if err != nil {
       return events.APIGatewayProxyResponse{
           Body:      err.Error(),
           StatusCode: 404,
       }, err
   }
   // 結果を構造体にパース
   item := Item{}
   err = dynamodbattribute.UnmarshalMap(result.Item, &item)
   if err != nil {
       return events.APIGatewayProxyResponse{
           Body:      err.Error(),
           StatusCode: 500,
       }, err
   }
   // httpレスポンス作成
   res := Response{
       RequestMethod: method,
       Result:       item,
   }
   jsonBytes, _ := json.Marshal(res)
   //返り値としてレスポンスを返す
   return events.APIGatewayProxyResponse{
       Body:      string(jsonBytes),
       StatusCode: 200,
   }, nil
}
func main() {
   lambda.Start(handler)
}
```
>
[AWS Lambda+API Gateway+DynamoDBでCRUD APIを作るのをGolangでやってみた](https://qiita.com/saki-engineering/items/e5cf56301d94ceea3ce0#lambda%E9%96%A2%E6%95%B0%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89api-gateway%E3%81%A8%E9%80%A3%E6%90%BA)
# 前提
- Lambda関数は作成済み
- APiGatewayは作成、デプロイ済み
- DynamoDBにてテーブル、itemは作成済み
#環境
- VsCode Version: 1.56.0
- Mac M1
- Delve Debugger Version: 1.6.0
- Go version: go1.16.3 darwin/arm64
- AWS CLI version aws-cli/2.2.0 Python/3.9.4 Darwin/20.3.0 source/arm64 prompt/off
# 背景
上記のコードでDynamoDBのテーブルからuser_idを指定してGetItem()によってitemを取得していますが、本当は複数のitemを取得したいです。そのコードを変更する際にローカルではデバッグできない(現状では、Lambdaコンソールに入り、実行ファイルのzipファイルをアップロードし、その後エンドポイントを叩く必要がある or API Gatewayコンソールでテストを実行する必要がある)ので、 ローカルでのデバッグ方法を知りたいです。
  • Go

    1267 questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • Visual Studio Code

    1653 questions

    Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

  • AWS Lambda

    520 questions

    AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

  • Amazon DynamoDB

    93 questions

    Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

1 参考リンクの追加

rapsody

rapsody score 7

2021/05/08 17:14  投稿

API Gatewayに紐付けたLambda関数をローカルでデバッグしたい。
# 解決したいこと
下記のAPI Gatewayに紐付けたプログラム(Lambda関数)をローカルでデバッグしたいです。
最も簡単にできる方法があれば教えていただきたいです。
当方、GoやAWSを触り始めたばかりの初心者のため、一つずつしっかりと学んでいきたいと思っています。
わかりやすく説明していただけると幸いです。
プログラム内容としては、APIGatewayのプロキシリクエストが来ると、DynamoDBのテーブルにアクセスして、itemを取得して返却するというものです。
よろしくお願い致します。
```Go
package main
import (
   "encoding/json"
   "github.com/aws/aws-lambda-go/events"
   "github.com/aws/aws-lambda-go/lambda"
   "github.com/aws/aws-sdk-go/aws"
   "github.com/aws/aws-sdk-go/aws/session"
   "github.com/aws/aws-sdk-go/service/dynamodb"
   "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)
// Item DBに入れるデータ
type Item struct {
   UserID     int   `dynamodbav:"user_id" json:user_id`
   CreatedTime string `dynamodbav:"created_time" json:created_time`
}
// Response Lambdaが返答するデータ
type Response struct {
   RequestMethod string `json:RequestMethod`
   Result       Item  `json:Result`
}
func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
   method := request.HTTPMethod
   pathparam := request.PathParameters["userid"]
   // DB接続
   sess, err := session.NewSession()
   if err != nil {
       return events.APIGatewayProxyResponse{
           Body:      err.Error(),
           StatusCode: 500,
       }, err
   }
   db := dynamodb.New(sess)
   // 検索条件を用意
   getParam := &dynamodb.GetItemInput{
       TableName: aws.String("tablename"),
       Key: map[string]*dynamodb.AttributeValue{
           "user_id": {
               N: aws.String(pathparam),
           },
       },
   }
   // 検索
   result, err := db.GetItem(getParam)
   if err != nil {
       return events.APIGatewayProxyResponse{
           Body:      err.Error(),
           StatusCode: 404,
       }, err
   }
   // 結果を構造体にパース
   item := Item{}
   err = dynamodbattribute.UnmarshalMap(result.Item, &item)
   if err != nil {
       return events.APIGatewayProxyResponse{
           Body:      err.Error(),
           StatusCode: 500,
       }, err
   }
   // httpレスポンス作成
   res := Response{
       RequestMethod: method,
       Result:       item,
   }
   jsonBytes, _ := json.Marshal(res)
   //返り値としてレスポンスを返す
   return events.APIGatewayProxyResponse{
       Body:      string(jsonBytes),
       StatusCode: 200,
   }, nil
}
func main() {
   lambda.Start(handler)
}
```
>  
[AWS Lambda+API Gateway+DynamoDBでCRUD APIを作るのをGolangでやってみた](https://qiita.com/saki-engineering/items/e5cf56301d94ceea3ce0#lambda%E9%96%A2%E6%95%B0%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89api-gateway%E3%81%A8%E9%80%A3%E6%90%BA)  
# 前提
- Lambda関数は作成済み
- APiGatewayは作成、デプロイ済み
- DynamoDBにてテーブル、itemは作成済み
#環境
- VsCode Version: 1.56.0
- Mac M1
- Delve Debugger Version: 1.6.0
- Go version: go1.16.3 darwin/arm64
- AWS CLI version aws-cli/2.2.0 Python/3.9.4 Darwin/20.3.0 source/arm64 prompt/off
# 背景
上記のコードでDynamoDBのテーブルからuser_idを指定してGetItem()によってitemを取得していますが、本当は複数のitemを取得したいです。そのコードを変更する際にローカルではデバッグできない(現状では、Lambdaコンソールに入り、実行ファイルのzipファイルをアップロードし、その後エンドポイントを叩く必要がある or API Gatewayコンソールでテストを実行する必要がある)ので、 ローカルでのデバッグ方法を知りたいです。
  • Go

    1267 questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • Visual Studio Code

    1653 questions

    Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

  • AWS Lambda

    520 questions

    AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

  • Amazon DynamoDB

    93 questions

    Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る