AWS S3、Python、Flaskによるファイル管理

テクノロジーの成長にとって重要な原動力の1つはデータである。技術の進歩に伴い、構築されるツールにおいて、データの重要性が高まり、極めて重要になっている。データをどのように収集し、保存し、保護し、配布するか、それがテクノロジー成長の原動力になっています。

このようなデータの増加により、一貫性と正確性を維持するために必要な手間を最小限に抑えながら、データを保存・管理するためのクラウドアーキテクチャの利用が増加しています。テクノロジーの消費者として、私たちはデータを生成し、消費しています。そのため、データを管理するための精巧なシステムが必要とされています。

クラウドアーキテクチャは、インターネットに接続されている限り、複数のデバイスからファイルをアップロードおよびダウンロードする能力を私たちに与えてくれます。AWSのS3バケットを利用することで、このようなことが可能になります。

S3とは何ですか?

Amazon Simple Storage Service (S3) は、Amazon Web Services (AWS) が提供する、ユーザーがデータをオブジェクトの形で保存できるようにするサービスです。これは、企業から小規模な組織や個人的なプロジェクトまで、あらゆる種類のユーザーに対応するように設計されています。

S3は、画像、ビデオ、オーディオからバックアップ、ウェブサイトの静的データなどのデータを保存するために使用することができます。

S3バケットは、AWS上でデータを保存するために使用される名前付きストレージリソースである。それは、AWS上でデータを格納するために使用されるフォルダのようなものである。バケットには固有の名前があり、ティアと価格に基づいて、ユーザーは異なる価格で異なるレベルの冗長性とアクセス性を受け取ることができます。

S3バケットへのアクセス権限は、AWSコンソール、AWS CLIツール、または提供されるAPIやライブラリを通じて指定することもできる。

Boto3とは?

Boto3は、AWSが提供するソフトウェア開発キット(SDK)で、S3のAPIやEC2(Elastic Compute Cloud)などのサービスとのやりとりを容易にするためのものです。Boto3を使用すると、すべてのS3バケットを一覧表示したり、EC2インスタンスを作成したり、任意の数のAWSリソースを制御したりすることができます。

なぜS3を使うのか?

データを保存するためのサーバーはいつでも自分たちで用意でき、インターネット経由で様々なデバイスからアクセスできるようにすることができますが、なぜAWSのS3を使う必要があるのでしょうか?便利なシーンがいくつかある。

まず、AWSのS3は、データを保存するサーバーの構築や維持にかかる作業やコストをすべて省くことができる。データをホスティングするハードウェアの調達や、インフラの維持に必要な人員を心配する必要はない。その代わりに、私たちはコードとサービスが最高の状態にあることを保証することだけに集中することができます。

S3を使用することで、AWSの素晴らしいパフォーマンス、可用性、およびスケーラビリティ能力を利用することができる。私たちのコードは、効果的にスケーリングし、高負荷下で実行し、エンドユーザーに高い可用性を提供することができるようになります。また、インフラストラクチャを構築・管理することなく、これを実現することができます。

AWSは、分析や監査、データの管理やレポート作成に役立つツールを提供しています。バケット内のデータがどのようにアクセスされているかを確認・分析したり、データを他の地域に複製してエンドユーザーによるデータへのアクセスを向上させたりすることも可能です。また、データは暗号化されて安全に保管されるため、常に安全です。

AWS Lambdaを通じて、S3バケットからアップロードまたはダウンロードされるデータに応答し、設定されたアラートやレポートを通じてユーザーに対応することもでき、テクノロジーに期待される、よりパーソナライズされた即時のエクスペリエンスを実現します。

AWSのセットアップ

S3を使い始めるには、AWSにアカウントを設定するか、既存のアカウントにログインする必要があります。

また、コマンドラインからリソースと対話できるように、AWS CLIツールをセットアップする必要があります。

これは、Mac、Linux、Windowsで利用可能です。

$ pip install awscli


CLIツールのセットアップが完了したら、プロファイルのドロップダウンで認証情報を生成し、それを使って以下のようにCLIツールを設定することができます。

$ aws configure


このコマンドでは、Access Key IDSecret Access Key、デフォルトのリージョン、出力フォーマットを指定するプロンプトが表示されます。AWS CLIツールの設定についての詳細は、こちらを参照してください。

私たちのアプリケーション – FlaskDrive

セットアップ

AWSでホストされているS3バケットにファイルをアップロードしたり、そこからダウンロードしたりできるFlaskアプリケーションを構築してみましょう。

これらの操作を容易にするためにBoto3 SDKを使用し、ユーザーがオンラインでホストされているようにファイルをアップロードして見ることができるようにするためのシンプルなフロントエンドを構築します。

Pythonプロジェクトで作業する際には、仮想環境を使用することが推奨されます。今回は、Pipenvツールを使用して、環境を作成および管理します。セットアップが完了したら、以下のようにPython3で環境を作成し、アクティベートします。

$ pipenv install --three
$ pipenv shell


次に、FlaskDriveアプリケーションをビルドするために必要なBoto3Flaskを以下のようにインストールする必要があります。

$ pipenv install flask
$ pipenv install boto3


実装

設定後、データを格納するバケットを作成する必要がありますが、これはAWSコンソールに向かい、サービスメニューからS3を選択することで実現できます。

バケットを作成したら、CLIツールで利用可能なバケットを確認します。

$ aws s3api list-buckets
{
    "Owner": {
        "DisplayName": "robley",
        "ID": "##########################################"
    },
    "Buckets": [
        {
            "CreationDate": "2019-09-25T10:33:40.000Z",
            "Name": "flaskdrive"
        }
    ]
}


Boto3 SDKを使用して、S3バケットにファイルをアップロード、ダウンロード、リストするための関数を作成します。

def upload_file(file_name, bucket):
    """
    Function to upload a file to an S3 bucket
    """
    object_name = file_name
    s3_client = boto3.client('s3')
    response = s3_client.upload_file(file_name, bucket, object_name)


return response


upload_file`関数は、ファイルとバケット名を受け取り、与えられたファイルをAWS上のS3バケットにアップロードします。

def download_file(file_name, bucket):
    """
    Function to download a given file from an S3 bucket
    """
    s3 = boto3.resource('s3')
    output = f"downloads/{file_name}"
    s3.Bucket(bucket).download_file(file_name, output)


return output


download_file` 関数はファイル名とバケットを受け取り、指定したフォルダにファイルをダウンロードします。

def list_files(bucket):
    """
    Function to list files in a given S3 bucket
    """
    s3 = boto3.client('s3')
    contents = []
    for item in s3.list_objects(Bucket=bucket)['Contents']:
        contents.append(item)


return contents


list_files` 関数は S3 バケット内のファイルを取得し、ファイル名をリストアップするために使用します。このファイル名を使って、S3バケットからファイルをダウンロードします。

S3のインタラクションファイルがあれば、Flaskアプリケーションを構築して、Webベースのインタラクションを提供することができます。アプリケーションは、以下のような構造を持つ、デモ用のシンプルな単一ファイルのFlaskアプリケーションになります。

.
├── Pipfile       # stores our application requirements
├── __init__.py
├── app.py        # our main Flask application
├── downloads     # folder to store our downloaded files
├── s3_demo.py    # S3 interaction code
├── templates
│   └── storage.html
└── uploads       # folder to store the uploaded files


Flaskアプリケーションのコア機能は、app.pyファイルに格納されます。

import os
from flask import Flask, render_template, request, redirect, send_file
from s3_demo import list_files, download_file, upload_file


app = Flask(__name__)
UPLOAD_FOLDER = "uploads"
BUCKET = "flaskdrive"


@app.route('/')
def entry_point():
    return 'Hello World!'


@app.route("/storage")
def storage():
    contents = list_files("flaskdrive")
    return render_template('storage.html', contents=contents)


@app.route("/upload", methods=['POST'])
def upload():
    if request.method == "POST":
        f = request.files['file']
        f.save(os.path.join(UPLOAD_FOLDER, f.filename))
        upload_file(f"uploads/{f.filename}", BUCKET)


return redirect("/storage")


@app.route("/download/<filename", methods=['GET'])
def download(filename):
    if request.method == 'GET':
        output = download_file(filename, BUCKET)


return send_file(output, as_attachment=True)


if __name__ == '__main__':
    app.run(debug=True)


これは、4つのエンドポイントを持つシンプルなFlaskアプリケーションです。

  • エンドポイント /storage はランディングページで、S3バケットにある現在のファイルをダウンロードできるように表示し、ユーザーがS3バケットにファイルをアップロードするためのインプットにもなります。
  • エンドポイント /upload はファイルを受信し、S3 バケットにファイルをアップロードする upload_file() メソッドを呼び出すために使用されます。
  • エンドポイント /download はファイル名を受け取り、download_file() メソッドを使用してユーザーのデバイスにファイルをダウンロードします。

そして最後に、私たちのHTMLテンプレートは次のようなシンプルなものになります。

<!DOCTYPE html

<html
<head
<titleFlaskDrive</title
</head
<body
<div class="content"
<h3Flask Drive: S3 Flask Demo</h3
<pWelcome to this AWS S3 Demo</p
<div
<h3Upload your file here:</h3
<form action="/upload" enctype="multipart/form-data" method="POST"
<input name="file" type="file"/
<input type="submit" value="Upload"/
</form
</div
<div
<h3These are your uploaded files:</h3
<pClick on the filename to download it.</p
<ul
            {% for item in contents %}
              <li
<a href="/download/{{ item.Key }}" {{ item.Key }} </a
</li
            {% endfor %}
          </ul
</div
</div
</body
</html


コードとフォルダのセットアップが完了したら、次のようにしてアプリケーションを開始します。

$ python app.py


http://localhost:5000/storage` に移動すると、次のようなランディング ページが表示されます。

入力フィールドを使ってファイルをアップロードすると、次のような出力が得られます。

S3ダッシュボードをチェックすることでアップロードを確認することができ、そこで画像を見つけることができます。

これで、AWSのS3ストレージにファイルがアップロードされました。

FlaskDriveのランディングページでは、ファイル名をクリックすることでファイルをダウンロードすることができます。

結論

この投稿では、AWSのS3にファイルを保存し、アプリケーションから同じファイルをダウンロードできるFlaskアプリケーションを作成しました。Boto3ライブラリをAWS CLIツールと一緒に使用し、アプリケーションとAWSの間のインタラクションを処理しました。

私たちは、ファイルの保存を処理するための独自のサーバーを持つ必要性を排除し、AWS Simple Storage Serviceを通じて、私たちのためにそれを処理するAmazonのインフラストラクチャを利用しました。このアプリケーションを開発し、デプロイし、エンドユーザーが利用できるようになるまでには、短期間しかかかりませんでしたが、現在では、他の機能とともにパーミッションを追加するために、このアプリケーションを拡張することができます。

このプロジェクトのソースコードは、Githubで公開されています。

</filename

タイトルとURLをコピーしました