Help us understand the problem. What is going on with this article?

AWS Amplify Libraryで取得した認証をAWS SDKで利用する

AWS Amplifyのライブラリが提供する機能群は便利ですが、S3を操作する一部の機能についてはAWS SDKと比べると少ない部分があります。そういったケースのために、Amplify側で取得した認証をAWS SDK側へ引き渡して使います。

サンプル S3のリストを実行する

Amplify ライブラリのStorageが提供するS3のListには、Delimiterなどによる柔軟な問い合わせ機能が用意されておらず、S3のListについてはAWS SDKを利用したいという場合を想定したサンプルです。

わかりやすくするために一つの関数へまとめていますが、AWS.S3クラスは流用させるため、他で作成して再利用させる形が良さそうです。

import AWS from 'aws-sdk';
import { Auth } from '@aws-amplify/auth';

const listFiles = async () => {
    const credentials = await Auth.currentCredentials();
    const s3 = new AWS.S3({
        credentials: credentials,
        region: '対象のリージョンの名前',
    });

    const req = s3.listObjectsV2({
        Bucket: '対象のバケットの名前',
    });
    req.promise().then((result) => {
        // 処理結果が返却されるので、あとは好きな処理をする
        console.log(result);
    }).catch(err => {
        // エラーハンドリングする
        console.error(err);
    });
}

認証情報の取得

下記の部分についてです。

const credentials = await Auth.currentCredentials();

事前にAuthにより、Cognitoによる認証が通っていることが前提です。Auth.currentCredentials() は、現在の認証情報を Promise<ICredentials> として返却します。ここでは await することで中身の ICredentials を取り出しています。

Promise<ICredentials> はAWS Amplify ライブラリの Auth クラスに所属するインターフェイスであり、下記のように定義されています。

export interface ICredentials {
    accessKeyId: string;
    sessionToken: string;
    secretAccessKey: string;
    identityId: string;
    authenticated: boolean;
}

認証の取れたユーザのキー情報などが入っているものであることがわかります。

認証情報の引き渡し

下記の部分についてです。

    const s3 = new AWS.S3({
        credentials: credentials,
        region: '対象のリージョンの名前',
    });

AWS Amplifyの Auth.currentCredentials() から取得できた認証情報を、そのままAWS SDKの AWS.S3 クラスのコンストラクタの credentials 変数へ代入しています。credentials は下記のように定義されています。

credentials?: Credentials|CredentialsOptions|null

credentials の実装を Auth.currentCredentials() で取れた値が満たすため、そのまま代入することができます。

処理の実行

あとは下記のように任意の処理を実行できます。

    const req = s3.listObjectsV2({
        Bucket: '対象のバケットの名前',
    });
    req.promise().then((result) => {
        // 処理結果が返却されるので、あとは好きな処理をする
        console.log(result);
    }).catch(err => {
        // エラーハンドリングする
        console.error(err);
    });
mediado
私たちメディアドゥは、電子書籍を読者に届けるために「テクノロジー」で「出版社」と「電子書店」を繋ぎ、その先にいる作家と読者を繋げる「電子書籍取次」事業を展開しております。業界最多のコンテンツラインナップとともに最新のテクノロジーを駆使した各種ソリューションを出版社や電子書店に提供し、グローバル且つマルチコンテンツ配信プラットフォームを目指しています。
https://mediado.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away