このチュートリアルでは、データベーストリガーを作成します。 trigger は、ドキュメントがコレクションに挿入されたときに サードパーティAPIを呼び出します。 trigger の関数は、公式のAWSソフトウェア開発キット(SDK)を外部依存関係として追加します。次に、この関数は SDK を使用して、挿入されたドキュメントを 拡張JSONオブジェクトとして S3 バケットに書込みます。
このタスクについて
このチュートリアルのAWS S3 の例では、 Node.jsライブラリを持つ任意のサードパーティ サービスに適用されるパターンを示しています。
必要な認証情報を シークレット として保存し、関数の 値 から参照。
関数内に
require()を含むパッケージをインポートし、保存した認証情報を使用して呼び出します。
始める前に
Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。
テストコレクションを持つ Atlas クラスター。開始するには、「 Atlas Infinite または Atlas Core クラスターの作成 」を参照してください。
AWS S3 バケット。作成方法については、 AWSドキュメントの「 汎用バケットの作成 」を参照してください。後で使用するために次の点に注意してください。
完全なバケット名
AWSリージョン
バケットの プレフィックスで を許可するAWS IAM
s3:PutObjectinserted-documents/*ポリシー。作成方法については、 AWSドキュメントにある「 IAM ポリシーの作成 」を参照してください。ポリシーがアタッチされたAWS IAM ユーザー。作成方法については、 AWSドキュメントの「 AWSアカウントで IAM ユーザーを作成する 」を参照してください。
IAM ユーザーの アクセス キー と シークレット アクセス キー 。作成方法については、 AWSドキュメントにある「 アクセスキーの作成 」を参照してください。
手順
AWS認証情報を値とシークレットとして保存
AWS認証情報を保存するには、次の値とシークレットを作成します。
AwsAccessKeyId: AWSアクセスキーIDを含む値。AwsSecretAccessKeySecret: AWSシークレット アクセス キーを含む シークレット 。AwsSecretAccessKey: シークレットにリンクする値。これにより、シークレットとして安全に保存された状態で、関数内のシークレット アクセス キーにアクセスできるようになります。
[ Values(値) ] ページに移動します。
Atlas で、 Triggers ページに移動します。
まだ表示されていない場合は、プロジェクトを含む組織をナビゲーション バーの Organizations メニューで選択します。
まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。
サイドバーで、 Streaming Data見出しの下のTriggersをクリックします。
Triggersページが表示されます。
View All Appsボタンをクリックします。
trigger を作成するアプリをクリックします。
サイドバーで、 Build見出しの下のValuesをクリックします。
シークレット アクセス キーを保存します。
注意
シークレット値には直接アクセスできないため、シークレットにリンクする 2 番目の 値 を作成する必要があります。
[Create a Value] をクリックします。
Value Name として
AwsSecretAccessKeyを入力します。Valueタイプを選択します。
Link to Secret オプションを選択します。
AwsSecretAccessKeySecretと入力し、Create "AwsSecretAccessKeySecret" をクリックしてシークレットに名前を付けます。AWSシークレット アクセス キーを、シークレット名の下に表示されるフィールドに貼り付けます。
シークレットと値の両方を作成するには、Save Draft をクリックします。
データベーストリガーとその機能を作成する
ドキュメントの挿入時に新しい関数を呼び出すデータベーストリガーを作成します。 aws-sdk 依存関係を追加し、同じ形式で関数コードを定義します。
[ trigger ] ページに移動します。
Atlas で、 Triggers ページに移動します。
まだ表示されていない場合は、プロジェクトを含む組織をナビゲーション バーの Organizations メニューで選択します。
まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。
サイドバーで、 Streaming Data見出しの下のTriggersをクリックします。
Triggersページが表示されます。
trigger を作成します。
Add Triggerをクリックしてトリガー設定ページを開きます。
Databasetrigger タイプを選択し、次の値を使用して trigger を構成します。
設定値Trigger NameWriteDocumentToS3TriggerWatch AgainstCollectionCluster Nameテスト クラスターの名前
Database Nameテストデータベースの名前
Collection Nameテストコレクションの名前
Operation TypeInsertのみを選択します。Event TypeFunctionFunctionセクションで、[+ New Function] を選択します。
関数を定義するには、次のコードを入力します。
YOUR_AWS_REGIONYOUR_S3_BUCKET_NAMEと を独自のAWSリージョンとAWSマネジメントコンソールからの完全なバケット名に置き換えます。
1 /* 2 * Write a newly-inserted document to an S3 bucket as an Extended JSON object. 3 */ 4 exports = async function writeDocumentToS3(changeEvent) { 5 const { fullDocument } = changeEvent; 6 7 // require calls must be in the exports function 8 const S3 = require("aws-sdk/clients/s3"); 9 const s3 = new S3({ 10 accessKeyId: context.values.get("AwsAccessKeyId"), 11 secretAccessKey: context.values.get("AwsSecretAccessKey"), 12 region: "YOUR_AWS_REGION", 13 }); 14 15 const key = `inserted-documents/${fullDocument._id.toString()}.json`; 16 17 // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property 18 await s3.putObject({ 19 Bucket: "YOUR_S3_BUCKET_NAME", 20 Key: key, 21 Body: EJSON.stringify(fullDocument), 22 ContentType: "application/json", 23 }).promise(); 24 25 return `Wrote document ${fullDocument._id} to ${key}`; 26 };
ドキュメントが挿入されるたびに、関数は次の処理を実行します。
変更イベントの
fullDocumentフィールドから挿入されたドキュメントを読み取ります。値に保存されているAWS認証情報で認証する S3 クライアントを作成します。
ドキュメントを
<_id>.jsonとしてバケットのinserted-documents/プレフィックスに書込みます。
注意
_idこの関数は、S3 オブジェクトキーの一部としてドキュメントの を使用します。ドキュメントで_id ObjectId 以外の 型が使用されている場合、キーは予想どおりにならない可能性があります。
トリガーをテストする
trigger が監視するコレクションにテストドキュメントを挿入します。対応する拡張JSONオブジェクトがS 3バケットにinserted-documents/ プレフィックスの下に表示されることを確認します。
mongoshを使用してクラスターに接続します。
方法については、 「 mongosh経由でクラスターに接続する 」を参照してください。
trigger が監視するドキュメントをコレクションに挿入します。
次の例では、テストコレクションに 1 つのドキュメントを挿入します。 YOUR_DATABASE_NAME と YOUR_COLLECTION_NAME を、trigger の作成時に入力したデータベースとコレクションに置き換えます。
// Replace YOUR_DATABASE_NAME and YOUR_COLLECTION_NAME with the // database and collection that the Trigger watches. use YOUR_DATABASE_NAME db.YOUR_COLLECTION_NAME.insertOne({ tutorialTest: "atlas-trigger-s3", createdAt: new Date() })
insertedId出力からの 値に注目してください。関数は、 S3 オブジェクトの名前としてこの値を使用します。
オブジェクトが S3 バケットに存在することを確認します。
AWSマネジメント コンソールで、S3 バケットを開き、inserted-documents/ プレフィックスに移動します。 という名前のオブジェクトが表示されます。<insertedId>.json <insertedId>insertedIdは前の手順の 値です。
注意
オブジェクトが表示されない場合は、trigger の実行ログを確認してください。その方法については、 trigger ログ を参照してください。