Overview
このチュートリアルでは、 MongoDB Atlasに接続してクエリを実行するGoドライバーを使用してサーバーレス関数を作成する方法と、サーバーレス環境でデータベース接続を効率的に管理する方法を説明します。
サーバーレス関数とデータベース接続
サーバーレス関数はサービスとしての関数(FaaS)とも呼ばれますが、需要に応じて自動的に増やす。関数のアップタイムやスケーリングは制御できないため、データベースの同時接続は慎重に管理する必要があります。データベース接続は制限されているため、効率的にデータベースに接続する必要があります。
Tutorial
このチュートリアルでは、次のアクションを実行する方法について説明します。
前提条件を確認します
AWS LambdaのGoプロジェクトを作成する
MongoDB接続コードを追加する
Lambda関数をビルドしてパッケージ
関数を配置してテストする
前提条件を確認します
開始する前に、次のものをお持ちであることを確認してください。
ネットワーク アクセスとユーザー ロールが構成された MongoDB Atlasクラスター。 AWSアカウントをお持ちの場合は、 AWS Marketplace を使用して、前払い契約なしで使用量を支払うことで、 MongoDB Atlasにサインアップできます。
MongoDB Atlas のサンプルデータセットがクラスターにロードされます。このサンプルデータをロードする方法については、 「 MongoDBスタートガイド 」を参照してください。
MongoDB Atlasクラスターは、 VPCまたはグローバルIP許可リストを介してAWSからのアクセスを許可する必要があります。データベースユーザーには、サンプルデータベースへの読み取りアクセス権が必要です。
AWS LambdaのGoプロジェクトを作成する
次のコマンドを実行中て、コンピューターに新しいGoプロジェクトを作成します。
mkdir lambdaexample cd lambdaexample go mod init lambdaexample
これらのコマンドはプロジェクトディレクトリを作成し、 AWS LambdaとMongoDB依存関係のGoモジュールを初期化します。
次のコマンドを実行中て、 MongoDB GoドライバーとAWS Lambda SDK をインストールします。
go get go.mongodb.org/mongo-driver/v2/mongo go get github.com/aws/aws-lambda-go/lambda
プロジェクトディレクトリに main.go という名前のファイルを作成します。このファイルには、 Lambda関数のコードが含まれます。
MongoDB接続コードを追加する
次のコードをmain.goファイルに追加します。
package main import ( "context" "os" "github.com/aws/aws-lambda-go/lambda" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/bson/primitive" "go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options" ) type EventInput struct { Limit int64 `json:"limit"` } type Movie struct { ID primitive.ObjectID `bson:"_id" json:"_id"` Title string `bson:"title" json:"title"` Year int32 `bson:"year" json:"year"` } func HandleRequest(ctx context.Context, input EventInput) ([]Movie, error) { if err != nil { return nil, err } collection := client.Database("sample_mflix").Collection("movies") opts := options.Find() if input.Limit != 0 { opts = opts.SetLimit(input.Limit) } cursor, err := collection.Find(ctx, struct{}{}, opts) if err != nil { return nil, err } var movies []Movie if err = cursor.All(ctx, &movies); err != nil { return nil, err } return movies, nil } func main() { client, err = mongo.Connect(options.Client().ApplyURI(os.Getenv("ATLAS_URI"))) if err != nil { return error } defer func() { _ = client.Disconnect(context.Background) }() lambda.Start(func(ctx context.Context, input EventInput) ([]Movie, error) { return HandleRequest(ctx context.Context, client, input EventInput) }) }
上記のコードでは、EventInput と Movie データ構造を定義しています。
EventInput 構造はAWS Lambda関数に送信される入力を表します。 [Limitフィールドは、返されるドキュメントの数を指定します。
Movie 構造は、sample_mflixデータベースの moviesコレクション内のドキュメントを表します。各フィールドにはBSONとJSON の注釈があります。 BSON注釈はMongoDBドキュメントフィールドをローカル変数にマッピングします。 JSON注釈は、ローカルフィールドを、 AWS Lambda が処理できるデータにマッピングします。必要な数のフィールドを含めることができます。含まれるフィールドのみが返されます。
Tip
Atlas_URI 環境変数
ATLAS_URI 値は、 AWS Lambda構成の環境変数として保存できます。
このコードは、HandleRequest 関数と main 関数の外部のデータベースに接続し、関数が実行されるたびではなく起動時にのみデータベース接続を確立するようにします。
HandleRequest 関数は sample_mflix.moviesコレクションをクエリし、指定された制限までドキュメントを返します。制限を指定しない場合は、すべてのドキュメントが返されます。この関数は結果をJSONとして返します。
関数を配置してテストする
AWS Lambdaダッシュボードを使用してプロジェクトをアップロードします。次の画像に示すように、ハンドラーの値が lambdaexample に設定され、アーキテクチャ値が x86_64 に設定されていることを確認します。

AWS Lambdaで環境変数を設定します。 ATLAS_URI 変数を追加し、その値をMongoDB Atlas接続文字列に設定します。

接続文字列は、MongoDB Atlasダッシュボードから取得できます。詳しくは、 「Goを使い始める 」のガイドをご覧ください。
AWS Lambdaダッシュボードの Testタブを使用して関数をテストします。イベントJSONにオプションの制限値を指定し、関数が sample_mflix.moviesコレクションからの映画のリストを返すことを確認します。返された Movieドキュメントは次のようになります。
{ "ID": ..., "Title": "The Truman Show", "Year": 1998 }
追加リソース
MongoDBでAWS Lambda を使用する際のベストプラクティスの詳細については、Atlasガイドの「 AWS Lambdaを使用した接続の管理 」を参照してください。