MongoDB.local SF, Jan 15: See the speaker lineup & ship your AI vision faster. Use WEB50 to save 50%
Find out more >
Docs Menu
Docs Home
/ /

チュートリアル: AWS LambdaからMongoDBに接続する

このチュートリアルでは、 MongoDB Atlasに接続してクエリを実行するGoドライバーを使用してサーバーレス関数を作成する方法と、サーバーレス環境でデータベース接続を効率的に管理する方法を説明します。

サーバーレス関数はサービスとしての関数(FaaS)とも呼ばれますが、需要に応じて自動的に増やす。関数のアップタイムやスケーリングは制御できないため、データベースの同時接続は慎重に管理する必要があります。データベース接続は制限されているため、効率的にデータベースに接続する必要があります。

このチュートリアルでは、次のアクションを実行する方法について説明します。

  • 前提条件を確認します

  • AWS LambdaのGoプロジェクトを作成する

  • MongoDB接続コードを追加する

  • Lambda関数をビルドしてパッケージ

  • 関数を配置してテストする

1

開始する前に、次のものをお持ちであることを確認してください。

  • ネットワーク アクセスとユーザー ロールが構成された MongoDB Atlasクラスター。 AWSアカウントをお持ちの場合は、 AWS Marketplace を使用して、前払い契約なしで使用量を支払うことで、 MongoDB Atlasにサインアップできます。

  • MongoDB Atlas のサンプルデータセットがクラスターにロードされます。このサンプルデータをロードする方法については、 「 MongoDBスタートガイド 」を参照してください。

  • Amazon Web Services (AWS)のアカウント。

MongoDB Atlasクラスターは、 VPCまたはグローバルIP許可リストを介してAWSからのアクセスを許可する必要があります。データベースユーザーには、サンプルデータベースへの読み取りアクセス権が必要です。

2

次のコマンドを実行中て、コンピューターに新しい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関数のコードが含まれます。

3

次のコードを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)
})
}

上記のコードでは、EventInputMovie データ構造を定義しています。

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として返します。

4

次のコマンドを実行中て、 AWS Lambdaに必要なオペレーティング システムとアーキテクチャのプロジェクトをビルドします。

env GOOS=linux GOARCH=amd64 go build

バイナリファイルをZIP アーカイブに追加します。バイナリファイルの名前は、特に指定がない限り、lambdaexample になります。

5

AWS Lambdaダッシュボードを使用してプロジェクトをアップロードします。次の画像に示すように、ハンドラーの値が lambdaexample に設定され、アーキテクチャ値が x86_64 に設定されていることを確認します。

AWS Lambda MongoDB Goプロジェクト

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

AWS Lambda MongoDB の構成

接続文字列は、MongoDB Atlasダッシュボードから取得できます。詳しくは、 「Goを使い始める 」のガイドをご覧ください。

AWS Lambdaダッシュボードの Testタブを使用して関数をテストします。イベントJSONにオプションの制限値を指定し、関数が sample_mflix.moviesコレクションからの映画のリストを返すことを確認します。返された Movieドキュメントは次のようになります。

{ "ID": ..., "Title": "The Truman Show", "Year": 1998 }

MongoDBでAWS Lambda を使用する際のベストプラクティスの詳細については、Atlasガイドの「 AWS Lambdaを使用した接続の管理 」を参照してください。

戻る

接続のトラブルシューティング

項目一覧