Amazon S3にファイルをアップロードする方法を、メリデメと一緒にまとめてみる

# はじめに

皆さんはS3にファイルをアップロードする時、どのような方法でアップロードしているでしょうか？

コンソール画面でアップロードしたり、AWS CLIを使ってアップロードしたりする方が多いかと思います。
エンジニアの方にとってはこれらの方法が一番シンプルかと思いますが、作業者のスキルセットによっては難しく感じることがあるかと思います。

そして、ただ単にS3にファイルをアップロードすると考えても、非常に多くの方法が考えられます。

この記事では、考えられる方法を列挙しつつ、それぞれのメリット・デメリットを整理していきます。

# AWSコンソール画面からファイルをアップロードする

## どのような方法か

AWSユーザーであれば一番最初に思いつくのがこの方法かと思います。
AWSのコンソール画面上で、手作業（主にマウス操作）で行う方法です。

手順を洗い出すとこんな感じになります。

1. IAM Identity CenterやIAMユーザーを使用してAWSのコンソール画面にログインする
1. S3の画面を開き、作業対象のバケットをクリックする
1. （必要に応じて）保存先のパスに移動する
1. 「アップロード」をクリックし、ドラッグアンドドロップもしくは「ファイルを追加」をクリックしてファイルをアップロードする

## メリット

以下のようなメリットが挙げられると思います。

- 前準備がほぼ不要
    - IAMユーザーの準備と、必要な権限付与さえされていれば前準備は不要です
- GUIで直観的に操作が可能
    - コンソール操作に慣れている人であれば誰でもできる方法です
    - AWSのコンソール画面の操作に慣れていなくても、多少のITリテラシーがあれば作業が可能

比較的誰でも作業が可能な方法かと思いますので、「とりあえずアップロードする方法が知りたい」という時に一番使える方法でしょう

ハンズオンなど、S3にファイルをアップロードすることが主目的ではない時にも最適な方法かと思います。

## デメリット

以下のようなデメリットが挙げられると思います。

- 操作ミスのリスクが高い
    - 適切な権限設定をしておかないと、別のS3バケットにファイルをアップロードしてしまったり、他のファイルを削除してしまったりする可能性があります
    - 加えて、全く別のAWSサービスに対して操作してしまうリスクもあります
- セキュリティを考慮した場合の前準備が少し面倒
    - IAMポリシーで適切な権限設定をしておけば上記のようなリスクは減らせますが、IAMポリシーやバケットポリシーを作成・管理する手間が発生します
    - 最小権限にこだわれなければ前準備はほぼ不要ですが、セキュリティを考慮すると少し手間が発生します
    - ユーザーが追加されたり、バケットが増えた時などの修正対応も面倒です
- コンソール画面のUIが変わると手順も変わってしまう
    - AWSのコンソール画面は頻繁に変更が発生します。手順書を作っている場合は更新の手間がかかりますし、UIの変更によって作業ミスをしてしまう可能性もあります。

必然的に手作業になるので、操作ミスのリスクやセキュリティ上の懸念が残る方法です。
対策方法もありますが、その場合は前準備や運用が少し手間になってしまいます。

頻繁にS3にファイルをアップロードする必要がある場合や、複数のアップロード作業が必要な場合には他の方法も検討した方が良いです。

# AWS CLIでファイルをアップロードする

## どのような方法か

ターミナルでのコマンド操作によってS3にファイルをアップロードする方法です。

手順を洗い出すとこんな感じになります。

1. AWS CLIを作業環境にインストールする
1. AWS CLIに認証情報を設定する
1. `aws s3 cp`もしくは`aws s3 mv`コマンドを使用してファイルをアップロードする

### 参考資料

https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/cli-chap-authentication.html

https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/cli-services-s3-commands.html

## メリット

以下のようなメリットが挙げられると思います。

- コマンド操作のみで作業が完結
    - ターミナルでの作業に慣れていれば、コンソール画面をわざわざ開くまでもなく作業が可能です
- 作業ミスのリスクが低い
    - コマンドで指定する送信元・送信先さえ間違えなければ、コンソールからアップロードする方法よりも作業ミスのリスクが低いです
    - `aws s3 cp`コマンドのみの実行であれば、他のAWSサービスを触るリスクもありません
- 柔軟性が高い
    - コマンドのオプションを使いこなすことで、ユースケースにあったコマンドを使うことができます
    - シェルスクリプトの中に埋め込んで他の作業と組み合わせたり、複雑なアップロード処理を自動化したりも可能なので、割と柔軟性が高い方法です

## デメリット

以下のようなデメリットが挙げられると思います。

- ターミナル操作に慣れていない方にはハードルが高い
    - 当然のことながら、AWS CLIのインストールや事前準備はターミナルでの操作になります。なので、ターミナル操作に慣れていなかったり、そもそも触ったことがない非エンジニアにはハードルが高すぎます。


また、デメリットと言えるか怪しいですが、適切なIAMの権限設定が行われていることが前提の方法です。S3にファイルをアップロードできる権限設定がされていないと、そもそも作業ができません。

しかし、エンジニアが作業するユースケースに限ればシンプル、安全、便利な方法なので最有力候補になる方法かと思います。


# サードパーティツールを使用する

## どのような方法か

WinSCPのようなサードパーティツールを使用してアップロードを行う方法です。
代表的なツールとしては、以下のようなものが挙げられます。
- WinSCP（Windows）
- Cyberduck（Windows、Mac）
- Filezilla（Windows、Linux、Mac）
- S3 Browser（Windows）

ソフトによって手順は異なりますが、おおむね以下のような手順になります。

1. ソフトをインストールする
1. AWSの認証情報の設定や、対象S3バケットのURLなどを設定
1. ファイルアップロードを行う

## メリット

以下のようなメリットが挙げられると思います。

- 使い慣れているツールであれば学習コストが低く抑えられる
    - 上記に記載したツールはどれも有名なものですので、所属組織ですでに使用してるという場合が多いと思います
    - 「AWSのコンソールには入ったことがない、でもこのWinSCPは普段から使用している」という場合に推奨される方法です
- GUI操作なので非エンジニアにも比較的優しい
    - コマンドやプログラムを使う必要がなくマウス操作でほぼ完結、AWSのマネジメントコンソールよりも機能が絞られてるため迷う余地も少ないです



## デメリット

以下のようなデメリットが挙げられると思います。

- アクセスキーを発行する必要がある
    - ツールによって微妙に異なりますが、アクセスキーを発行してツールの設定に入れ込む必要があります
    - AWSではアクセスキーの発行は推奨されておらず、発行する際には使っていないアクセスキーの棚卸しなどを定期的に行うことが推奨されます
- サードパーティツールを入れられない環境では難しい
    - 組織のセキュリティポリシーによってはインストールできるソフトウェアに制限がかかっていることがありますが、そのような制限がある場合には難しい方法です

すでに何かデータ転送用のサードパーティツールを使っていて、ITリテラシーがそこまで高くない人が作業をする場合に最適な手段となります。
ただし、運用方法についてはあらかじめ考えておく必要があるので、その点においては注意です。

# S3へのアップロード専用のWebインターフェイスを作る
## どのような方法か

アップロードをすることだけに特化したWebインターフェイスを作り、作業者はWebサイト上でアップロード作業を行うという方法です。

フロンドエンドの開発などが必要になりますが、AWSが公式に提供してくれているテンプレートを使用することで、かなり簡単に実装ができます。

例えば、以下のようなAmplifyのテンプレートが公開されています

https://github.com/aws-samples/s3uploader-ui

このテンプレートの使い方を説明したAWSブログもありますので、初学者であっても学習コストがそこまでかかりません。

https://aws.amazon.com/jp/blogs/news/allowing-external-users-to-securely-and-directly-upload-files-to-amazon-s3/

加えて、つい今月「Storage Browser for Amazon S3」というオープンソースも公開されました。

https://aws.amazon.com/jp/blogs/news/connect-users-to-data-through-your-apps-with-storage-browser-for-amazon-s3/

これらを使用することで、比較的簡単にWebインターフェイスを作ることができます。

## メリット

以下のようなメリットが挙げられると思います。
（上記に記載のテンプレートを使用する想定で書いています）

- ユーザーが使用しやすいUIを提供できる
    - 非エンジニアであっても操作しやすいUIを提供するWebインターフェイスを作ることができます
- ユーザー認証の機能も実装可能
    - アップロードをするユーザーに対して、ID/パスワードでの認証を実装することも可能です
    - ユーザー管理もCognitoなどで可能なので、セキュリティ面も考慮されます

## デメリット

以下のようなデメリットが挙げられると思います。
（上記に記載のテンプレートを使用する想定で書いています）

- それなりの学習コストがかかる
    - 実装が比較的簡単とはいえ、テンプレートをデプロイできるくらいの基礎的なリテラシーは必要となります
- 管理運用においてAWSサービスの知識が必要
    - デプロイに使用するAmplifyや、ユーザー管理に使用するCognitoの知識などは管理運用する上で必要になります

それなりに学習コストがかかるとはいえ、AWSに関するナレッジは数多く公開されていますので、それらを活用することでデメリットを解消することができるかと思います。
ただ、一時的なアップロード操作の場合には過剰になります。定期的にファイルアップロードを行うなどのユースケースで効果を発揮する方法だと思います。


# まとめ

S3にファイルをアップロードする代表的な方法を紹介してきました。
いずれもメリデメがありますので、それらを把握した上でどの方法を選択するか検討いただければなと思います。

また、この記事は私が知りうる範囲での記載になっています。
「こんな方法もあるよ」や「こんな観点もあるよ」といったフィードバックがあればSNSでのシェアやコメントをいただけると嬉しいです。

この記事がどこかで誰かの役に立てば嬉しいです！