# URL pré-signée

Le service de stockage **Stockage Objet** de cegedim.cloud prend en charge la génération d'URL pré-signées afin d'accorder l'accès aux objets sans avoir besoin d'authentification.

Les URL pré-signées sont utilisées pour fournir un accès à durée limitée, à un objet privé dans votre **Bucket** S3. Ils fonctionnent en ajoutant une `Access key`, une date d'expiration et une signature (**Sigv4**) comme paramètres de requête à l'objet S3.

Il y a deux cas d'utilisation courants où vous pouvez les utiliser :

* Partage simple et occasionnel d'objets.
* Accès fréquent et programmatique pour visualiser un objet dans une application
* Accès fréquent et programmatique au téléchargement d'un objet par l'intermédiaire d'une application

## Générer une URL pré-signée (téléchargement) <a href="#presignedurls-generationduneurls3presignee" id="presignedurls-generationduneurls3presignee"></a>

{% hint style="info" %}
Nous utilisons les utilitaires **aws s3** et **aws s3api** issues du client S3 **AWSCLIv2** sur Linux. **`${S3_ENDPOINT}`** et **`${S3_PROFILE}`** sont des variables d'environnement.
{% endhint %}

{% code overflow="wrap" %}

```bash
aws s3 --endpoint-url=${S3_ENDPOINT} presign s3://bucket-test/feather.ttf --expires-in 600 --profile ${S3_PROFILE}
```

{% endcode %}

{% code title="résultat" overflow="wrap" %}

```
https://storage-eb4.cegedim.cloud/bucket-test/feather.ttf?AWSAccessKeyId=fzs37xbv5615hygx2wkm&Signature=S4jFPas53s8cnwdDieMHrhc0ddE%3D&Expires=1666821099
```

{% endcode %}

Dans cet exemple, l'URL générée a une expiration de **10 minutes.** Passé ce délai, l'objet ne sera plus accessible, via cette URL.

{% hint style="info" %}
**--expires-in** : Nombre de secondes avant l'expiration de l'URL pré-signée.\
La valeur par défaut est de 3600 secondes.\
Le délai maximal d'expiration est de **7 jours** (604800 secondes).
{% endhint %}

## Générer une URL pré-signée (téléversement)

{% hint style="danger" %}
Si un objet ayant la même clé existe déjà dans le bucket spécifié dans l'URL pré-signée, l'objet existant sera remplacé.
{% endhint %}

{% hint style="info" %}
**aws** s3 et aws **s3api** ne supportent pas la génération d'url pré-signées pour l'upload.

Vous devez utiliser AWS SDK pour créer une url pré-signée pour l'upload.

Ci-dessous, un exemple simple utilisant \[AWS SDK pour Python (Boto3)][(https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)
{% endhint %}

{% hint style="info" %}
L'URL pré-signée d'upload ne fonctionne qu'avec un adressage de **type chemin**.

Remplacez `aws_access_key_id` et `aws_secret_access_key` par vos propres identifiants.

`ExpiresIn` (entier) : Nombre de secondes avant l'expiration de l'URL pré-signée. La valeur par défaut est de 3600 secondes. Le délai d'expiration maximal est de 7 jours.
{% endhint %}

```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import boto3
from botocore.client import Config
s3 = boto3.client('s3')
s3 = boto3.client(
    's3',
    aws_access_key_id='xxxxx',
    aws_secret_access_key='xxxxx',
    config=Config(s3={'addressing_style': 'path'}),
    endpoint_url='https://storage-eb4.cegedim.cloud'
)
bucket = "bucket-test"
key = "feather.ttf"

print(s3.generate_presigned_url('put_object', Params={'Bucket':bucket,'Key':key}, ExpiresIn=300, HttpMethod='PUT'))
```

```sh
# Output

# Run Python script
./create_presign_url_upload.py

#Ouput
https://storage-eb4.cegedim.cloud/bucket-test/feather.ttf?AWSAccessKeyId=fzs37xbv5615hygx2wkm&Signature=NI%2BvoHYhWEFPDR04ioeFfBz5fks%3D&Expires=1712056959
```

Vous pouvez utiliser un outil tel que `curl` pour télécharger votre fichier dans le bucket, en utilisant l'URL générée précédemment :

```sh
curl --request PUT --upload-file feather.ttf 'https://storage-eb4.cegedim.cloud/bucket-test/feather.ttf?AWSAccessKeyId=fzs37xbv5615hygx2wkm&Signature=NI%2BvoHYhWEFPDR04ioeFfBz5fks%3D&Expires=1712056959'
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://academy.cegedim.cloud/francais/stockage/stockage-objet/stockage-objet-architecture/url-pre-signee.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
