私と私の猫の他は誰でも隠し事を持っている

野良プログラマ発、日々のアウトプット

Amplify プログラムで、Storage (S3) に保存したファイルを複製する

AWS Amplify 上でウェブアプリ(Vue.js 製)を開発しているのですが、バックエンドの Storage API を使って S3 に保存したファイルを複製しようとして、「あれ? StorageClass にゃコピー用メソッド無いねぇ。どうするん?」ってなった時の話です。

結果、別途 aws-sdk の S3 クライアント使えってことらしいです(当たり前か)。本件ユースケースは、マルチユーザ型(Cognito で認証・認可管理)のフォトアルバムサービスのようなサービスの開発をイメージして頂ければわかり易いかと。なので、Auth API で得たクレデンシャルを S3 クライアント生成時に与えてやるのがミソですな。Vue.js の単一ファイルコンポーネント内で処理を行う場合は、こんな感じです。

<script>
import aws_exports from '@/aws-exports'
import { Auth } from "aws-amplify"
import AWS from 'aws-sdk'

export default {
(中略)
  methods: {
    // S3 上のファイル src を dst にコピーする
    duplicateS3File: async function (src, dst) {
      try {
        const credentials = await Auth.currentUserCredentials();
        const s3 = new AWS.S3({
          apiVersion: '2006-03-01',
          region: 'ap-northeast-1',
          accessKeyId: credentials['accessKeyId'],
          secretAccessKey: credentials['secretAccessKey'],
          sessionToken: credentials['sessionToken']
        })
        const params = {
          CopySource: `${aws_exports.aws_user_files_s3_bucket}/public/${src}`,
          Bucket: aws_exports.aws_user_files_s3_bucket,
          Key: `public/${dst}`
        }
        await s3.copyObject(params).promise()
        return true
      }
      catch (error) {
        return false
      }
    },
(後略)
  }
}
</script>

S3.copyObject() のパラメタは何だか分かりづらいですが、これは以前 PHP プログラムで同様のことをやって経験済みだったので悩まずに済みました。