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

# AWS S3 बकेट

{% hint style="warning" %}
AWS S3 के लिए, उपयोग करें [Datasources](/datasets/hi/create-and-upload/adding-data/datasources.md) और Bucket Mirror, जब तक कि आपको स्पष्ट रूप से एक बार के या तदर्थ आयात की आवश्यकता न हो। Datasources स्क्रिप्ट, presigned URLs, या स्थानीय डाउनलोड के बिना छवियों और मेटाडेटा को सिंक में रखते हैं।
{% endhint %}

यह पेज केवल एक बार के या तदर्थ अपलोड के लिए वैकल्पिक वर्कफ़्लो को कवर करता है:

* **साइन किए गए URL**: presigned URLs का उपयोग करके, उन्हें पहले स्थानीय रूप से डाउनलोड किए बिना, S3 से सीधे Roboflow में छवियाँ अपलोड करें।
* **CLI लोकल**: S3 से छवियाँ अपनी स्थानीय मशीन पर डाउनलोड करें, फिर उन्हें Roboflow में अपलोड करें। जब आपको अपलोड करने से पहले छवियों को preprocess या inspect करना हो, तब इसका उपयोग करें।

यदि आप Roboflow और S3 के बीच एक पुन: प्रयोज्य कनेक्शन सेट कर रहे हैं, तो यहाँ रुकें और उपयोग करें [Datasources](/datasets/hi/create-and-upload/adding-data/datasources.md) प्लस [AWS S3 क्रेडेंशियल्स](/datasets/hi/create-and-upload/adding-data/datasource-credentials/aws-s3.md).

## AWS CLI सेटअप

स्क्रिप्ट का उपयोग करने से पहले, सुनिश्चित करें कि AWS CLI के पास लक्षित bucket तक पहुँच है।

{% hint style="info" %}
स्थानीय एक बार वाले workflows के लिए, अपनी आवश्यक न्यूनतम bucket permissions के साथ non-root AWS identity का उपयोग करें। यदि आपका लक्ष्य Roboflow में लगातार S3 ingestion है, तो इस स्थानीय सेटअप का पुन: उपयोग न करें। इसके बजाय एक Datasource credential बनाएँ।
{% endhint %}

* [AWS CLI संस्करण 2 इंस्टॉल करना](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)

### AWS CLI कॉन्फ़िगर करना

1. AWS CLI इंस्टॉल करने के बाद, एक terminal या command prompt खोलें।
2. निम्नलिखित कमांड चलाएँ:

   ```bash
   aws configure
   ```
3. आपसे अपने AWS credentials दर्ज करने के लिए कहा जाएगा:

   ```
   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 के माध्यम से अपलोड करें

इसका उपयोग केवल एक बार के या scripted imports के लिए करें जहाँ आप Datasource नहीं बनाना चाहते।

आप Python में boto3 का उपयोग करके S3 bucket में अपनी छवियों के लिए signed URLs जनरेट कर सकते हैं।

```python
def generate_presigned_url(bucket_name: str, object_name: str, region: str = 'us-east-2') -> str:
    """एक S3 object के लिए 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
```

ऊपर दिए गए code snippet में, आपको अपने S3 bucket का नाम, S3 bucket में image का object name, और AWS region चाहिए। image का signed URL जनरेट किया जाता है और वापस किया जाता है।

इसके आधार पर, हम एक पूर्ण समाधान बना सकते हैं जो S3 bucket में उपलब्ध सभी objects को खींचता है, और फिर उन्हें 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 object के लिए 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 bucket में object keys की सूची प्राप्त करें।"""
    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 में एक image अपलोड करें।"""
    API_URL = "https://api.roboflow.com"
    यदि 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)

    # response code जाँचें
    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 से डेटा को स्थानीय रूप से डाउनलोड करें

इसका उपयोग केवल तभी करें जब आपको अपलोड से पहले स्थानीय preprocessing, inspection, या file transformation की आवश्यकता हो। अन्यथा, उपयोग करें [Datasources](/datasets/hi/create-and-upload/adding-data/datasources.md).

AWS से डेटा अपलोड करने के लिए, पहले `awscli` [command line tool](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)इंस्टॉल करें। यह टूल आपको command line पर अपने AWS account के साथ इंटरैक्ट करने देता है। command line tool इंस्टॉल करने के बाद, निम्नलिखित कमांड चलाएँ:

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

बदलें `mybucket` को अपने bucket के नाम से और `folder_path` को उस folder या file के नाम से बदलें जिसे आप export करना चाहते हैं। यह कमांड AWS से assets को आपकी current working directory (`.`).

## Roboflow में डेटा अपलोड करें

अब जब हमने डेटा डाउनलोड कर लिया है, हम इसे Roboflow में या तो [Upload Web Interface](/datasets/hi/create-and-upload/adding-data.md#upload-data-with-the-web-application) या [Roboflow CLI](/datasets/hi/create-and-upload/adding-data.md#upload-datasets-with-the-command-line).

## यह भी देखें

* [Datasources (Bucket Mirror)](/datasets/hi/create-and-upload/adding-data/datasources.md) - S3 से बिना scripting के निरंतर, स्वचालित sync
* [AWS S3 क्रेडेंशियल्स](/datasets/hi/create-and-upload/adding-data/datasource-credentials/aws-s3.md) - Datasources के लिए सुरक्षित AWS सेटअप
* [Roboflow project ID प्राप्त करें](https://docs.roboflow.com/reference/authentication/authentication/workspace-and-project-ids)
