

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Utilisation de Presigned URLs pour S3 sur Outposts
<a name="S3OutpostsPresignedURL"></a>

Pour accorder un accès limité dans le temps aux objets stockés localement dans un Outpost sans mettre à jour votre stratégie de compartiment, vous pouvez utiliser une URL présignée. Avec Presigned URLs, en tant que propriétaire du bucket, vous pouvez partager des objets avec des personnes dans votre cloud privé virtuel (VPC) ou leur donner la possibilité de télécharger ou de supprimer des objets. 

Lorsque vous créez une URL présignée à l'aide du AWS SDKs ou du AWS Command Line Interface (AWS CLI), vous associez l'URL à une action spécifique. Vous accordez également un accès limité dans le temps à l'URL présignée en choisissant un délai d'expiration personnalisé qui peut aller de 1 seconde à 7 jours. Lorsque vous partagez l'URL présignée, la personne dans le VPC peut effectuer l'action intégrée dans l'URL comme s'il s'agissait de l'utilisateur connecté d'origine. Lorsque l'URL atteint son délai d'expiration, elle expire et ne fonctionne plus.

## Limitation des capacités des URL présignées
<a name="S3OutpostsPresignedUrlUploadObjectLimitCapabilities"></a>

Les capacités d’une URL présignée sont limitées par les autorisations de l’utilisateur qui l’a créée. Essentiellement, les jetons présignés URLs sont des jetons porteurs qui donnent accès à ceux qui les possèdent. À ce titre, nous vous recommandons de les protéger de manière appropriée. 

**AWS Version 4 de la signature (SigV4)**  
Pour appliquer un comportement spécifique lorsque les demandes d'URL présignées sont authentifiées à l'aide de AWS Signature Version 4 (SigV4), vous pouvez utiliser des clés de condition dans les politiques de compartiment et les politiques de point d'accès. Par exemple, vous pouvez créer une stratégie de compartiment qui utilise la condition `s3-outposts:signatureAge` pour refuser toute demande d'URL présignée Amazon S3 on Outposts sur les objets du compartiment `example-outpost-bucket` si la signature date de plus de 10 minutes. Pour utiliser cet exemple, remplacez les *`user input placeholders`* par vos propres informations.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Deny a presigned URL request if the signature is more than 10 minutes old",
            "Effect": "Deny",
            "Principal": {"AWS":"444455556666"},
            "Action": "s3-outposts:*",
            "Resource": "arn:aws:s3-outposts:us-east-1:111122223333:outpost/op-01ac5d28a6a232904/bucket/example-outpost-bucket/object/*",
            "Condition": {
                "NumericGreaterThan": {"s3-outposts:signatureAge": 600000},
                "StringEquals": {"s3-outposts:authType": "REST-QUERY-STRING"}
            }
        }
    ]
}
```

------

Pour obtenir la liste des clés de condition et des exemples de stratégies supplémentaires que vous pouvez utiliser pour imposer un comportement spécifique lorsque des requêtes d'URL présignées sont authentifiées à l'aide de Signature Version 4, consultez [AWS Clés de politique spécifiques à l'authentification Signature Version 4 (SigV4)](s3-outposts-bucket-policy-s3-sigv4-conditions.md).

**Restriction de chemin réseau**  
Si vous souhaitez restreindre l'utilisation de l'accès présigné URLs et de tous les accès S3 on Outposts à des chemins réseau particuliers, vous pouvez écrire des politiques qui nécessitent un chemin réseau particulier. Pour définir la restriction sur le principal IAM qui effectue l'appel, vous pouvez utiliser des politiques basées sur l'identité Gestion des identités et des accès AWS (IAM) (par exemple, des politiques d'utilisateur, de groupe ou de rôle). Pour définir la restriction de la ressource S3 on Outposts, vous pouvez utiliser des stratégies basées sur les ressources (par exemple, des stratégies de compartiment et de point d'accès). 

Une restriction de chemin réseau sur le principal IAM exige que l'utilisateur de ces informations d'identification effectue des requêtes à partir du réseau spécifié. Une restriction sur le compartiment ou le point d’accès nécessite que toutes les requêtes adressées à cette ressource proviennent du réseau spécifié. Ces restrictions s'appliquent également hors du scénario des URL présignées.

La condition globale IAM que vous utilisez dépend du type de point de terminaison. Si vous utilisez le point de terminaison public pour S3 on Outposts, utilisez `aws:SourceIp`. Si vous utilisez le point de terminaison d'un VPC pour S3 sur Outposts, utilisez `aws:SourceVpc` ou `aws:SourceVpce`.

La déclaration de politique IAM suivante exige que le principal AWS n'accède qu'à partir de la plage réseau spécifiée. Avec cette déclaration de stratégie, tous les accès doivent provenir de cette plage, même lorsqu'une personne utilise une URL présignée pour S3 on Outposts. Pour utiliser cet exemple, remplacez les *`user input placeholders`* par vos propres informations.

```
{
    "Sid": "NetworkRestrictionForIAMPrincipal",
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
        "NotIpAddressIfExists": {"aws:SourceIp": "IP-address-range"},
        "BoolIfExists": {"aws:ViaAWSService": "false"}
    }
}
```

Pour un exemple de politique de compartiment qui utilise la clé de condition `aws:SourceIP` AWS globale pour restreindre l'accès à un compartiment S3 on Outposts à une plage réseau spécifique, consultez. [Configuration d’IAM avec S3 sur Outposts](S3OutpostsIAM.md)

## Utilisateurs habilités à créer une URL présignée
<a name="S3Outpostswho-presigned-url"></a>

Toute personne qui possède des autorisations de sécurité valides peut créer une URL présignée. Mais pour qu'un utilisateur dans le VPC puisse accéder correctement à un objet, l'URL présignée doit être créée par une personne qui possède l'autorisation d'effectuer l'opération sur laquelle l'URL présignée est basée.

Vous pouvez utiliser les informations d'identification suivantes pour créer une URL présignée  :
+ **Profil d'instance IAM** : valide pendant 6 heures.
+ **AWS Security Token Service** : valide pendant 36 heures lorsque signé avec des autorisations permanentes, telles que les autorisations de l'utilisateur root du Compte AWS ou d'un utilisateur IAM.
+ **Utilisateur IAM** — Valable jusqu'à 7 jours lorsque vous utilisez AWS Signature version 4.

  Afin de créer une URL présignée valide pendant 7 jours, commencez par déléguer des autorisations d'utilisateur IAM (clé d'accès et clé secrète) pour le kit SDK que vous utilisez. Générez ensuite une URL présignée à l'aide de la version 4 de la AWS signature.

**Note**  
Si vous avez créé une URL présignée à l'aide d'un jeton temporaire, l'URL expire lorsque le jeton expire, même si vous avez créé l'URL avec une heure d'expiration postérieure.
Dans la mesure où URLs les buckets S3 on Outposts sont autorisés à accéder à ceux qui possèdent l'URL, nous vous recommandons de les protéger de manière appropriée. Pour plus d'informations sur la protection des documents présignés URLs, consultez[Limitation des capacités des URL présignées](#S3OutpostsPresignedUrlUploadObjectLimitCapabilities).

## Quand S3 on Outposts vérifie-t-il la date et l'heure d'expiration dans une URL présignée ?
<a name="S3Outpostspresigned-url-when-checked"></a>

S3 on Outposts vérifie la date et l'heure d'expiration d'une URL signée au moment de la requête HTTP. Par exemple, si un client commence à télécharger un fichier volumineux immédiatement avant la date d'expiration, le téléchargement continue même si la date d'expiration intervient pendant le téléchargement. Cependant, si la connexion est perdue et que le client essaie de redémarrer le téléchargement une fois la date d'expiration passée, le téléchargement échoue.

Pour plus d'informations sur l'utilisation d'une URL présignée pour partager ou charger des objets, consultez les rubriques suivantes.

**Topics**
+ [Limitation des capacités des URL présignées](#S3OutpostsPresignedUrlUploadObjectLimitCapabilities)
+ [Utilisateurs habilités à créer une URL présignée](#S3Outpostswho-presigned-url)
+ [Quand S3 on Outposts vérifie-t-il la date et l'heure d'expiration dans une URL présignée ?](#S3Outpostspresigned-url-when-checked)
+ [Partage d'objets à l'aide d'une signature préalable URLs](S3OutpostsShareObjectPresignedURL.md)
+ [Génération d'une URL présignée pour charger un objet sur un compartiment S3 on Outposts](S3OutpostsPresignedUrlUploadObject.md)

# Partage d'objets à l'aide d'une signature préalable URLs
<a name="S3OutpostsShareObjectPresignedURL"></a>

Pour accorder un accès limité dans le temps aux objets stockés localement dans un Outpost sans mettre à jour votre stratégie de compartiment, vous pouvez utiliser une URL présignée. Avec Presigned URLs, en tant que propriétaire du bucket, vous pouvez partager des objets avec des personnes dans votre cloud privé virtuel (VPC) ou leur donner la possibilité de télécharger ou de supprimer des objets. 

Lorsque vous créez une URL présignée à l'aide du AWS SDKs ou du AWS Command Line Interface (AWS CLI), vous associez l'URL à une action spécifique. Vous accordez également un accès limité dans le temps à l'URL présignée en choisissant un délai d'expiration personnalisé qui peut aller de 1 seconde à 7 jours. Lorsque vous partagez l'URL présignée, la personne dans le VPC peut effectuer l'action intégrée dans l'URL comme s'il s'agissait de l'utilisateur connecté d'origine. Lorsque l'URL atteint son délai d'expiration, elle expire et ne fonctionne plus.



Lorsque vous créez une URL présignée, vous devez fournir vos informations d'identification de sécurité, puis spécifier les éléments suivants : 
+ Un point d'accès pour Amazon Resource Name (ARN) du compartiment S3 on Outposts
+ Une clé d'objet
+ Une méthode HTTP (`GET` pour télécharger des objets)
+ Une date et une heure d'expiration

Une URL présignée est uniquement valide pendant la durée spécifiée. Autrement dit, vous devez commencer l'action autorisée par l'URL avant la date et l'heure d'expiration. Vous pouvez utiliser une URL présignée plusieurs fois, jusqu'à la date et l'heure d'expiration. Si vous avez créé une URL présignée à l'aide d'un jeton temporaire, alors l'URL expire lorsque le jeton expire, même si vous avez créé l'URL avec une heure d'expiration postérieure.

Les utilisateurs du cloud privé virtuel (VPC) qui ont accès à l'URL présignée peuvent accéder à l'objet. Par exemple, si votre compartiment contient une vidéo et que ce compartiment et l'objet sont confidentiels, vous pouvez partager la vidéo avec d'autres en générant une URL présignée. Dans la mesure où URLs les buckets S3 on Outposts sont autorisés à accéder à ceux qui possèdent l'URL, nous vous recommandons de les protéger de manière appropriée. URLs Pour plus de détails sur la protection des documents présignés URLs, consultez[Limitation des capacités des URL présignées](S3OutpostsPresignedURL.md#S3OutpostsPresignedUrlUploadObjectLimitCapabilities). 

Toute personne qui possède des autorisations de sécurité valides peut créer une URL présignée. Cependant, l'URL présignée doit être créée par une personne disposant des autorisations nécessaires pour effectuer l'opération sur laquelle l'URL présignée est basée. Pour de plus amples informations, veuillez consulter [Utilisateurs habilités à créer une URL présignée](S3OutpostsPresignedURL.md#S3Outpostswho-presigned-url).

Vous pouvez générer une URL présignée pour partager un objet dans un compartiment S3 on Outposts en utilisant AWS SDKs le et le. AWS CLI Pour plus d’informations, consultez les exemples suivants. 

## En utilisant le AWS SDKs
<a name="S3OutpostsShareObjectPreSignedURLSDK"></a>

Vous pouvez utiliser le AWS SDKs pour générer une URL présignée que vous pouvez communiquer à d'autres personnes afin qu'elles puissent récupérer un objet. 

**Note**  
Lorsque vous utilisez le AWS SDKs pour générer une URL présignée, le délai d'expiration maximal d'une URL présignée est de 7 jours à compter de sa création. 

------
#### [ Java ]

**Example**  
L’exemple suivant génère une URL présignée que vous pouvez communiquer à d’autres afin qu’ils puissent récupérer un objet depuis un compartiment S3 sur Outposts. Pour de plus amples informations, veuillez consulter [Utilisation de Presigned URLs pour S3 sur Outposts](S3OutpostsPresignedURL.md). Pour utiliser cet exemple, remplacez les *`user input placeholders`* par vos propres informations.  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.HttpMethod;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;

import java.io.IOException;
import java.net.URL;
import java.time.Instant;

public class GeneratePresignedURL {

    public static void main(String[] args) throws IOException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String accessPointArn = "*** access point ARN ***";
        String objectKey = "*** object key ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();

            // Set the presigned URL to expire after one hour.
            java.util.Date expiration = new java.util.Date();
            long expTimeMillis = Instant.now().toEpochMilli();
            expTimeMillis += 1000 * 60 * 60;
            expiration.setTime(expTimeMillis);

            // Generate the presigned URL.
            System.out.println("Generating pre-signed URL.");
            GeneratePresignedUrlRequest generatePresignedUrlRequest =
                    new GeneratePresignedUrlRequest(accessPointArn, objectKey)
                            .withMethod(HttpMethod.GET)
                            .withExpiration(expiration);
            URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

            System.out.println("Pre-Signed URL: " + url.toString());
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process 
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

**Example**  
L’exemple suivant génère une URL présignée que vous pouvez communiquer à d’autres afin qu’ils puissent récupérer un objet depuis un compartiment S3 sur Outposts. Pour de plus amples informations, veuillez consulter [Utilisation de Presigned URLs pour S3 sur Outposts](S3OutpostsPresignedURL.md). Pour utiliser cet exemple, remplacez les *`user input placeholders`* par vos propres informations.   

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;

namespace Amazon.DocSamples.S3
{
    class GenPresignedURLTest
    {
        private const string accessPointArn = "*** access point ARN ***"; 
        private const string objectKey = "*** object key ***";
        // Specify how long the presigned URL lasts, in hours.
        private const double timeoutDuration = 12;
        // Specify your bucket Region (an example Region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            string urlString = GeneratePreSignedURL(timeoutDuration);
        }
        static string GeneratePreSignedURL(double duration)
        {
            string urlString = "";
            try
            {
                GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest
                {
                    BucketName = accessPointArn,
                    Key = objectKey,
                    Expires = DateTime.UtcNow.AddHours(duration)
                };
                urlString = s3Client.GetPreSignedURL(request1);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            return urlString;
        }
    }
}
```

------
#### [ Python ]

L'exemple suivant génère une URL présignée pour partager un objet à l'aide du SDK pour Python (Boto3). Par exemple, utilisez un client Boto3 et la fonction `generate_presigned_url` pour générer une URL présignée qui vous permet d'accéder à un objet `GET`.

```
import boto3
    url = boto3.client('s3').generate_presigned_url(
    ClientMethod='get_object', 
    Params={'Bucket': 'ACCESS_POINT_ARN', 'Key': 'OBJECT_KEY'},
    ExpiresIn=3600)
```

Pour plus d'informations sur l'utilisation du kit SDK pour Python (Boto3) pour générer une URL présignée, consultez la section [Python](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url) dans la *Référence d'API AWS SDK pour Python (Boto) *.

------

## En utilisant le AWS CLI
<a name="S3OutpostsShareObjectPresignedCLI"></a>

L'exemple de AWS CLI commande suivant génère une URL présignée pour un compartiment S3 on Outposts. Pour utiliser cet exemple, remplacez les *`user input placeholders`* par vos propres informations.

**Note**  
Lorsque vous utilisez le AWS CLI pour générer une URL présignée, le délai d'expiration maximal d'une URL présignée est de 7 jours à compter de sa création. 

```
aws s3 presign s3://arn:aws:s3-outposts:us-east-1:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/example-outpost-access-point/mydoc.txt --expires-in 604800
```

Pour de plus amples informations, veuillez consulter [presign](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/presign.html) (présigner) dans la *Référence des commandes AWS CLI *.

# Génération d'une URL présignée pour charger un objet sur un compartiment S3 on Outposts
<a name="S3OutpostsPresignedUrlUploadObject"></a>

Pour accorder un accès limité dans le temps aux objets stockés localement dans un Outpost sans mettre à jour votre stratégie de compartiment, vous pouvez utiliser une URL présignée. Avec Presigned URLs, en tant que propriétaire du bucket, vous pouvez partager des objets avec des personnes dans votre cloud privé virtuel (VPC) ou leur donner la possibilité de télécharger ou de supprimer des objets. 

Lorsque vous créez une URL présignée à l'aide du AWS SDKs ou du AWS Command Line Interface (AWS CLI), vous associez l'URL à une action spécifique. Vous accordez également un accès limité dans le temps à l'URL présignée en choisissant un délai d'expiration personnalisé qui peut aller de 1 seconde à 7 jours. Lorsque vous partagez l'URL présignée, la personne dans le VPC peut effectuer l'action intégrée dans l'URL comme s'il s'agissait de l'utilisateur connecté d'origine. Lorsque l'URL atteint son délai d'expiration, elle expire et ne fonctionne plus.

Lorsque vous créez une URL présignée, vous devez fournir vos informations d'identification de sécurité, puis spécifier les éléments suivants : 
+ Un point d'accès pour Amazon Resource Name (ARN) du compartiment S3 on Outposts
+ Une clé d'objet
+ Une méthode HTTP (`PUT` pour le chargement d'objets)
+ Une date et une heure d'expiration

Une URL présignée est uniquement valide pendant la durée spécifiée. Autrement dit, vous devez commencer l'action autorisée par l'URL avant la date et l'heure d'expiration. Vous pouvez utiliser une URL présignée plusieurs fois, jusqu'à la date et l'heure d'expiration. Si vous avez créé une URL présignée à l'aide d'un jeton temporaire, alors l'URL expire lorsque le jeton expire, même si vous avez créé l'URL avec une heure d'expiration postérieure. 

Si l'action autorisée par l'URL présignée est composée de plusieurs étapes, comme un chargement partitionné, vous devez démarrer l'ensemble des étapes avant l'expiration. Si S3 on Outposts tente de démarrer une étape avec une URL expirée, vous recevrez une erreur.

Les utilisateurs du cloud privé virtuel (VPC) qui ont accès à l'URL présignée peuvent charger des objets. Par exemple, un utilisateur du VPC qui a accès à l'URL présignée peut charger un objet dans votre compartiment. Étant donné que la version présignée URLs accorde l'accès à votre bucket S3 on Outposts à tout utilisateur du VPC ayant accès à l'URL présignée, nous vous recommandons de protéger ces URL de manière appropriée. URLs Pour plus de détails sur la protection des documents présignés URLs, consultez[Limitation des capacités des URL présignées](S3OutpostsPresignedURL.md#S3OutpostsPresignedUrlUploadObjectLimitCapabilities). 

Toute personne qui possède des autorisations de sécurité valides peut créer une URL présignée. Cependant, l'URL présignée doit être créée par une personne disposant des autorisations nécessaires pour effectuer l'opération sur laquelle l'URL présignée est basée. Pour de plus amples informations, veuillez consulter [Utilisateurs habilités à créer une URL présignée](S3OutpostsPresignedURL.md#S3Outpostswho-presigned-url).

## Utilisation du AWS SDKs pour générer une URL présignée pour une opération d'objet S3 on Outposts
<a name="s3-outposts-presigned-urls-upload-examples"></a>

------
#### [ Java ]

**SDK pour Java 2.x**  
Cet exemple montre comment générer une URL présignée que vous pouvez utiliser pour charger un objet dans un compartiment S3 on Outposts pour une durée limitée. Pour de plus amples informations, veuillez consulter [Utilisation de Presigned URLs pour S3 sur Outposts](S3OutpostsPresignedURL.md).   

```
    public static void signBucket(S3Presigner presigner, String outpostAccessPointArn, String keyName) {

        try {
            PutObjectRequest objectRequest = PutObjectRequest.builder()
                    .bucket(accessPointArn)
                    .key(keyName)
                    .contentType("text/plain")
                    .build();

            PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
                    .signatureDuration(Duration.ofMinutes(10))
                    .putObjectRequest(objectRequest)
                    .build();

            PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);


            String myURL = presignedRequest.url().toString();
            System.out.println("Presigned URL to upload a file to: " +myURL);
            System.out.println("Which HTTP method must be used when uploading a file: " +
                    presignedRequest.httpRequest().method());

            // Upload content to the S3 on Outposts bucket by using this URL.
            URL url = presignedRequest.url();

            // Create the connection and use it to upload the new object by using the presigned URL.
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type","text/plain");
            connection.setRequestMethod("PUT");
            OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
            out.write("This text was uploaded as an object by using a presigned URL.");
            out.close();

            connection.getResponseCode();
            System.out.println("HTTP response code is " + connection.getResponseCode());

        } catch (S3Exception e) {
            e.getStackTrace();
        } catch (IOException e) {
            e.getStackTrace();
        }
    }
```

------
#### [ Python ]

**Kit SDK for Python (Boto3)**  
Cet exemple montre comment générer une URL présignée qui peut exécuter une action S3 on Outposts pour une durée limitée. Pour de plus amples informations, veuillez consulter [Utilisation de Presigned URLs pour S3 sur Outposts](S3OutpostsPresignedURL.md). Pour effectuer une requête avec l'URL, utilisez le package `Requests`.  

```
import argparse
import logging
import boto3
from botocore.exceptions import ClientError
import requests

logger = logging.getLogger(__name__)


def generate_presigned_url(s3_client, client_method, method_parameters, expires_in):
    """
    Generate a presigned S3 on Outposts URL that can be used to perform an action.

    :param s3_client: A Boto3 Amazon S3 client.
    :param client_method: The name of the client method that the URL performs.
    :param method_parameters: The parameters of the specified client method.
    :param expires_in: The number of seconds that the presigned URL is valid for.
    :return: The presigned URL.
    """
    try:
        url = s3_client.generate_presigned_url(
            ClientMethod=client_method,
            Params=method_parameters,
            ExpiresIn=expires_in
        )
        logger.info("Got presigned URL: %s", url)
    except ClientError:
        logger.exception(
            "Couldn't get a presigned URL for client method '%s'.", client_method)
        raise
    return url


def usage_demo():
    logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')

    print('-'*88)
    print("Welcome to the Amazon S3 on Outposts presigned URL demo.")
    print('-'*88)

    parser = argparse.ArgumentParser()
    parser.add_argument('accessPointArn', help="The name of the S3 on Outposts access point ARN.")
    parser.add_argument(
        'key', help="For a GET operation, the key of the object in S3 on Outposts. For a "
                    "PUT operation, the name of a file to upload.")
    parser.add_argument(
        'action', choices=('get', 'put'), help="The action to perform.")
    args = parser.parse_args()

    s3_client = boto3.client('s3')
    client_action = 'get_object' if args.action == 'get' else 'put_object'
    url = generate_presigned_url(
        s3_client, client_action, {'Bucket': args.accessPointArn, 'Key': args.key}, 1000)

    print("Using the Requests package to send a request to the URL.")
    response = None
    if args.action == 'get':
        response = requests.get(url)
    elif args.action == 'put':
        print("Putting data to the URL.")
        try:
            with open(args.key, 'r') as object_file:
                object_text = object_file.read()
            response = requests.put(url, data=object_text)
        except FileNotFoundError:
            print(f"Couldn't find {args.key}. For a PUT operation, the key must be the "
                  f"name of a file that exists on your computer.")

    if response is not None:
        print("Got response:")
        print(f"Status: {response.status_code}")
        print(response.text)

    print('-'*88)


if __name__ == '__main__':
    usage_demo()
```

------