> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/datasets/ja/toappurdo/adding-data/upload-data-from-aws-gcp-and-azure/aws-s3-bucket.md).

# AWS S3 バケット

{% hint style="warning" %}
AWS S3 では、 [データソース](/datasets/ja/toappurdo/adding-data/datasources.md) 明示的に一回限りまたは随時のインポートが必要でない限り、Bucket Mirror を使用してください。Datasources は、スクリプト、事前署名付き URL、ローカル डाउनलोडなしで画像とメタデータを同期します。
{% endhint %}

このページでは、一回限りまたは随時のアップロードに対するフォールバック ワークフローのみを扱います:

* **署名付き URL**: 画像を最初にローカルへダウンロードせず、事前署名付き URL を使って S3 から Roboflow に直接アップロードします。
* **ローカル CLI**: S3 から画像をローカルマシンにダウンロードし、その後 Roboflow にアップロードします。アップロード前に画像を前処理または確認する必要がある場合に使用してください。

Roboflow と S3 の間で再利用可能な接続を設定している場合は、ここで止めて、 [データソース](/datasets/ja/toappurdo/adding-data/datasources.md) プラス [AWS S3 認証情報](/datasets/ja/toappurdo/adding-data/datasource-credentials/aws-s3.md).

## AWS CLI のセットアップ

スクリプトを使用する前に、AWS CLI が対象バケットにアクセスできることを確認してください。

{% hint style="info" %}
ローカルで一回限りのワークフローを行う場合は、必要最小限のバケット権限を持つ非 root の AWS ID を使用してください。目的が Roboflow への継続的な S3 取り込みである場合、このローカル設定を再利用しないでください。代わりに Datasource の認証情報を作成してください。
{% endhint %}

* [AWS CLI バージョン 2 のインストール](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)

### AWS CLI の設定

1. AWS CLI をインストールしたら、ターミナルまたはコマンドプロンプトを開きます。
2. 次のコマンドを実行してください:

   ```bash
   aws configure
   ```
3. AWS 認証情報の入力を求められます:

   ```
   AWS Access Key ID [None]: YOUR_ACCESS_KEY
   AWS Secret Access Key [None]: YOUR_SECRET_ACCESS_KEY
   Default region name [None]: YOUR_PREFERRED_REGION (e.g., us-west-1)
   Default output format [None]: json
   ```

## オプション 1: 署名付き URL でアップロード

Datasource を作成したくない一回限りのインポートやスクリプトによるインポートにのみ使用してください。

Python の boto3 を使って、S3 バケット内の画像用の署名付き URL を生成できます。

```python
def generate_presigned_url(bucket_name: str, object_name: str, region: str = 'us-east-2') -> str:
    """S3 オブジェクトの事前署名付き URL を生成します。"""
    s3 = boto3.client('s3', region_name=region, config=Config(signature_version='s3v4'))
    url = s3.generate_presigned_url('get_object',
                                    Params={'Bucket': bucket_name, 'Key': object_name},
                                    ExpiresIn=3600)
    return url
```

上記のコードスニペットでは、S3 バケット名、S3 バケット内の画像のオブジェクト名、そして AWS リージョンが必要です。画像の署名付き URL が生成され、返されます。

これを基に、S3 バケット内の利用可能なすべてのオブジェクトを取得し、それらを API 経由で Roboflow にアップロードする完全なソリューションを作成できます。このソリューションの概要は以下のとおりです:

```python
import boto3
import requests
import urllib.parse
from botocore.config import Config

# ************* 以下の変数を設定してください *************
S3_BUCKET_NAME = "YOUR_S3_BUCKET_NAME"
ROBOFLOW_API_KEY = "YOUR_ROBOFLOW_API_KEY"
ROBOFLOW_PROJECT_NAME = "YOUR_ROBOFLOW_PROJECT_NAME"
# ***********************************************

def generate_presigned_url(bucket_name: str, object_name: str, region: str = 'us-east-2') -> str:
    """S3 オブジェクトの事前署名付き URL を生成します。"""
    s3 = boto3.client('s3', region_name=region, config=Config(signature_version='s3v4'))
    url = s3.generate_presigned_url('get_object',
                                    Params={'Bucket': bucket_name, 'Key': object_name},
                                    ExpiresIn=3600)
    return url

def get_s3_objects(bucket_name: str) -> list:
    """指定した S3 バケット内のオブジェクトキーの一覧を取得します。"""
    s3 = boto3.client('s3')
    objects = []
    response = s3.list_objects_v2(Bucket=bucket_name)
    for obj in response['Contents']:
        objects.append(obj['Key'])
    return objects

def upload_to_roboflow(api_key: str, project_name: str, presigned_url: str, img_name='', split="train"):
    """画像を Roboflow にアップロードします。"""
    API_URL = "https://api.roboflow.com"
    if img_name == '':
        img_name = presigned_url.split("/")[-1]

    "".join([
        API_URL + "/dataset/" + project_name + "/upload",
        "?api_key=" + api_key,
        "&name=" + img_name,
        "&split=" + split,
        "&image=" + urllib.parse.quote_plus(presigned_url),
    ])
    response = requests.post(upload_url)

    # レスポンスコードを確認
    if response.status_code == 200:
        print(f"{img_name} を {project_name} に正常にアップロードしました")
        return True
    else:
        print(f"{img_name} のアップロードに失敗しました。エラー: {response.content.decode('utf-8')}")
        return False

if __name__ == "__main__":
    # 利用可能な画像の一覧を取得
    available_images = get_s3_objects(S3_BUCKET_NAME)
    
    # 必要に応じて、ここで画像をフィルタリングします
    # 例: available_images = [img for img in available_images if "some_condition"]
    
    # 画像を Roboflow にアップロード
    for image in available_images:
        presigned_url = generate_presigned_url(S3_BUCKET_NAME, image)
        upload_to_roboflow(ROBOFLOW_API_KEY, ROBOFLOW_PROJECT_NAME, presigned_url)

```

## オプション 2: AWS からデータをローカルにダウンロード

アップロード前にローカルでの前処理、確認、またはファイル変換が必要な場合にのみ使用してください。そうでない場合は、 [データソース](/datasets/ja/toappurdo/adding-data/datasources.md).

AWS からデータをアップロードするには、まず `awscli` [コマンドラインツール](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)をインストールしてください。このツールを使うと、コマンドラインから AWS アカウントを操作できます。コマンドラインツールをインストールしたら、次のコマンドを実行してください:

```bash
aws s3 sync s3://mybucket/folder_path .
```

置き換えてください `mybucket` をバケット名に置き換え、 `folder_path` をエクスポートしたいフォルダーまたはファイル名に置き換えます。このコマンドは、AWS からアセットを現在の作業ディレクトリ（`.`).

## Roboflow にデータをアップロード

データをダウンロードしたので、これを Roboflow にアップロードできます。方法は、 [アップロード Web インターフェース](/datasets/ja/toappurdo/adding-data.md#upload-data-with-the-web-application) または [Roboflow CLI](/datasets/ja/toappurdo/adding-data.md#upload-datasets-with-the-command-line).

## 関連項目

* [Datasources（Bucket Mirror）](/datasets/ja/toappurdo/adding-data/datasources.md) - スクリプト不要で S3 から継続的かつ自動的に同期
* [AWS S3 認証情報](/datasets/ja/toappurdo/adding-data/datasource-credentials/aws-s3.md) - Datasources 用の安全な AWS 設定
* [Roboflow のプロジェクト ID を取得する](https://docs.roboflow.com/reference/authentication/authentication/workspace-and-project-ids)
