> 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/roboflow/roboflow-ko/datasets/adding-data/upload-data-from-aws-gcp-and-azure/aws-s3-bucket.md).

# AWS S3 버킷

{% hint style="warning" %}
AWS S3의 경우 다음을 사용하세요. [Datasources](/roboflow/roboflow-ko/datasets/adding-data/datasources.md) 및 Bucket Mirror를 사용하세요. 단, 일회성 또는 ad hoc 가져오기가 정말 필요한 경우는 예외입니다. Datasources는 스크립트, presigned URL 또는 로컬 다운로드 없이 이미지와 메타데이터를 동기화 상태로 유지합니다.
{% endhint %}

이 페이지에서는 일회성 또는 ad hoc 업로드에 대한 대체 워크플로만 다룹니다:

* **Signed URLs**: presigned URL을 사용해 이미지를 먼저 로컬에 다운로드하지 않고 S3에서 Roboflow로 직접 업로드합니다.
* **로컬 CLI**: S3에서 이미지를 로컬 머신으로 다운로드한 다음 Roboflow에 업로드합니다. 업로드 전에 이미지를 전처리하거나 검사해야 할 때 사용하세요.

Roboflow와 S3 사이에 재사용 가능한 연결을 설정하는 경우, 여기서 멈추고 [Datasources](/roboflow/roboflow-ko/datasets/adding-data/datasources.md) 및 [AWS S3 Credentials](/roboflow/roboflow-ko/datasets/adding-data/datasources/datasource-credentials/aws-s3.md).

## AWS CLI 설정

스크립트를 사용하기 전에 AWS CLI가 대상 버킷에 접근할 수 있는지 확인하세요.

{% hint style="info" %}
로컬 일회성 워크플로의 경우, 필요한 최소 버킷 권한을 가진 루트가 아닌 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 (예: us-west-1)
   Default output format [None]: json
   ```

## 옵션 1: Signed URL로 업로드

Datasource를 생성하지 않으려는 일회성 또는 스크립트 기반 가져오기에만 사용하세요.

Python의 boto3를 사용하여 S3 버킷의 이미지에 대한 signed URL을 생성할 수 있습니다.

```python
def generate_presigned_url(bucket_name: str, object_name: str, region: str = 'us-east-2') -> str:
    """S3 객체에 대한 presigned 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 지역이 필요합니다. 이미지의 signed 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 객체에 대한 presigned 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]

    upload_url = "".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에서 데이터를 로컬로 다운로드

업로드 전에 로컬 전처리, 검사 또는 파일 변환이 필요할 때만 사용하세요. 그렇지 않다면 다음을 사용하세요. [Datasources](/roboflow/roboflow-ko/datasets/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에 업로드할 수 있습니다. [업로드 웹 인터페이스](/roboflow/roboflow-ko/datasets/adding-data.md#upload-data-with-the-web-application) 또는 [Roboflow CLI](/roboflow/roboflow-ko/datasets/adding-data.md#upload-datasets-with-the-command-line).

## 참고

* [Datasources (Bucket Mirror)](/roboflow/roboflow-ko/datasets/adding-data/datasources.md) — 스크립팅 없이 S3에서 지속적으로 자동 동기화
* [AWS S3 Credentials](/roboflow/roboflow-ko/datasets/adding-data/datasources/datasource-credentials/aws-s3.md) — Datasources를 위한 안전한 AWS 설정
* [Roboflow 프로젝트 ID 가져오기](https://docs.roboflow.com/api-reference/workspace-and-project-ids)
