AWS S3への画像アップロード方法とS3の設定方法

Web開発

皆さん、こんちは!

最近、あまりこのブログを更新していないのですが。。

そんなことは置いておいて。

今回は、AWSのS3についてでも書こうかと思います。

書きたい内容としては、

みなさん画像をS3へアプロードする処理を書く機会があると思うのですが、

それについてわかりやすく書こうかと。

画像をアップロードするためのAWS側の設定

まず、一番躓くのがAWS側の設定のほうだと思います。

1つずつやりましょう。

S3の設定

まずはS3でバケットをつくりましょう。

名前は適当でよいです。

後で使うので、メモしておいてください。

s3 setting

バケット名を入力したら、パブリックアクセスの設定があるので、以下のように入力する。

s3 setting

今回は、アクセスコントロールリスト(ACL)を使用して各画像を公開設定とするので、上2つのチェックボックスを外して登録します。

すぐ下の承認確認チェックボックスも忘れずにチェックしてください。

残りのS3の設定はお好きなように。

IAMユーザの追加・ポリシーの設定

IAMユーザの追加はプログラムからS3へアクセスするために必須です。

新しくユーザを追加しましょう。

IAMページでユーザ追加から、以下のようにユーザを作成する。

今回はプログラムからのみ、このユーザを使用してS3にアクセスするので「アクセスキー・プログラムによるアクセス」を選択する。

iam user setting

あとはそのまま次のステップを選択していけばユーザ作成完了。

※最後のステップ画面で、AWSのACCESS KEY IDとACCESS KEYが記載されたCSVファイルをダウンロードすることを忘れずに!

次にポリシーを作成する。

ポリシーの作成をクリックすると以下の画面が見れると思います。

iam policy

ここが一番重要な点です。

以下を参考に入力してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::{YOUR BUCKET NAME}"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::{YOUR BUCKET NAME}/*"
        }
    ]
}

{YOUR BUCKET NAME}は先ほど作成したバケット名をいれてください。

補足的に説明すると。

単にS3のバケットに画像等をアップロード・削除するだけなら、以下の3つだけでOKです。

"s3:PutObject"
"s3:GetObject"
"s3:DeleteObject"

今回、やりたいことはプログラムから、ACLのpublic-readを付けた状態(公開状態)で画像をアップロードしたいので、

"s3:PutObjectAcl"

を付けてます。

これをつけないで、boto3のupload_file or upload_fileobjにExtraArgs={“ACL”: “public-read”}を引数で与えると権限がないのでエラーとなります。

そのまま、次のステップへ進みポリシーを登録する。

ポリシー追加後、そのポリシーをIAMユーザへ紐づけます。

作成したIAMユーザページから、アクセス権限の追加をクリックする。

iam add policy user

一番左の「既存のポリシーを直接アタッチ」をクリックする。

※ここの「ポリシーの作成」から、ポリシーを作ってもよかったですね。

iam add policy user

あとは、作成済みのポリシーを検索&チェックして紐づけたら完了です。

boto3を使用して画像のアップロード方法

ここまでくれば、あとはboto3のサンプルコード(Python)にしたがって書くだけです。

import logging
import boto3
from botocore.exceptions import ClientError


def upload_file(file_name, bucket, object_name):
    """Upload a file to an S3 bucket

    :param file_name: File to upload
    :param bucket: Bucket to upload to
    :param object_name: S3 object name. If not specified then file_name is used
    :return: True if file was uploaded, else False
    """

    # Upload the file
    s3_client = boto3.client(
        "s3",
        aws_access_key_id={YOUR AWS ACCESS KEY ID},
        aws_secret_access_key={YOUR AWS SECRET ACCESS KEY},
        region_name="ap-northeast-1"
    )
    try:
        response = s3_client.upload_file(file_name, bucket, object_name, ExtraArgs={"ACL": "public-read"})
    except ClientError as e:
        logging.error(e)
        return False
    return True

参照:

Uploading files - Boto3 1.28.68 documentation

以下は、IAMユーザで作成したユーザのものをいれてください。

{YOUR AWS ACCESS KEY ID}

{YOUR AWS SECRET ACCESS KEY}

これで、試しに画像をS3にアップロードしてみてください。

※上の場合、 {"ACL": "public-read"}をつけているので、アップロード後、公開設定となりますのでご注意ください。見られていけないものはS3へあげないように!

ではでは。

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