

# S3 on Outposts での署名付き URL の使用
<a name="S3OutpostsPresignedURL"></a>

バケットポリシーを更新せずに、Outpost にローカルに保存されているオブジェクトへの時間制限付きのアクセス許可を付与するには、事前署名付きの URL を使用します。署名付き URL を使用すると、バケット所有者は仮想プライベートクラウド (VPC) 内の個人とオブジェクトを共有したり、オブジェクトをアップロードまたは削除する権限を、これらのユーザーに付与したりできます。

AWS SDK または AWS Command Line Interface(AWS CLI) を使用して署名付き URL を作成する際には、その URL に対し特定のアクションを関連付けます。また、1 秒から 7 日まで指定可能なカスタム有効期限を選択して、署名付き URL に対し期間制限付きのアクセス許可を付与できます。署名付き URL を共有すると、VPC 内のユーザーは署名元のユーザーと同じように、URL に埋め込まれたアクションを実行できるようになります。この URL は有効期限が切れると失効し、以後は機能しなくなります。

## 署名付き URL 機能の制限
<a name="S3OutpostsPresignedUrlUploadObjectLimitCapabilities"></a>

署名付き URL の機能は、それを作成したユーザーの許可によって制限されます。本質的に署名付き URL は、それらを保有しているユーザーに対しアクセスを許可するためのベアラートークンです。そのため、適切に保護することをお勧めします。

**AWS Signature Version 4 (SigV4)**  
署名済み URL リクエストが AWS Signature Version 4 (SigV4) により認証される際に実行する特定の動作を適用するには、バケットポリシーとアクセスポイントポリシーで条件キーを使用します。例えば、`s3-outposts:signatureAge` 条件を使用するバケットポリシーを作成し、署名が作成されてから 10 分以上経過している場合に、`example-outpost-bucket` バケット内のオブジェクトに対する Amazon S3 on Outposts の署名付き URL リクエストを、すべて拒否することができます。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。

------
#### [ 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"}
            }
        }
    ]
}
```

------

Signature Version 4 を使用している署名付き URL リクエストで、その認証時に実行する特定の動作を適用するための条件キー、および他のポリシー例のリストについては、「[AWS Signature Version 4 (SigV4) での認証固有ポリシーキー](s3-outposts-bucket-policy-s3-sigv4-conditions.md)」を参照してください。

**ネットワークパスでの制限**  
署名付き URL の使用と、S3 on Outposts アクセスをすべて特定のネットワークパスに制限する場合は、その特定のネットワークパスを使用しながら (IAM) ポリシーを記述できます。呼び出しを行う IAM プリンシパルに対する制限を設定するには、ID ベースの AWS Identity and Access Management (IAM) ポリシー (ユーザー、グループ、ロールポリシーなど) を使用できます。S3 on Outposts リソースでの制限を設定する場合は、リソースベースのポリシー (バケットポリシーやアクセスポイントポリシーなど) を使用します。

IAM プリンシパルでのネットワークパスの制限では、これらの認証情報のユーザーは、指定したネットワークからリクエストを送信する必要があります。バケットまたはアクセスポイントの制限により、そのリソースに対するすべてのリクエストは、指定したネットワークから発信される必要があります。これらの制限は、署名付き URL のシナリオ以外でも適用されます。

使用する IAM グローバル条件は、エンドポイントのタイプによって異なります。S3 on Outposts でパブリックエンドポイントを使用している場合は、`aws:SourceIp` を使用します。S3 on Outposts の VPC エンドポイントを使用している場合は、`aws:SourceVpc` または `aws:SourceVpce` を使用します。

次の IAM ポリシーステートメントでは、プリンシパルは、指定されたネットワーク範囲からのみ AWS にアクセスする必要があります。このポリシーステートメントでは、すべてのアクセスがその範囲から発信される必要があります。これは、S3 on Outposts の署名付き URL を使用するユーザーに対しても当てはまります。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。

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

S3 on Outposts バケットへのアクセスを特定のネットワーク範囲に制限するために、`aws:SourceIP` AWS グローバル条件キーを使用するバケットポリシーの例については、「[S3 on Outposts で IAM を設定する](S3OutpostsIAM.md)」を参照してください。

## 署名付き URL を作成できるユーザー
<a name="S3Outpostswho-presigned-url"></a>

有効なセキュリティ認証情報を持つすべてのユーザーが、署名付き URL を作成できます。しかし、VPC 内のユーザーがオブジェクトに正常にアクセスするには、署名付き URL をベースにするオペレーションの実行許可を持っているユーザーにより、この署名付き URL が作成されている必要があります。

以下の認証情報は、署名付き URL の作成に使用することができます。
+ **IAM インスタンスプロファイル** – 最大 6 時間有効。
+ **AWS Security Token Service** – AWS アカウント ルートユーザーや IAM ユーザーの認証情報など、永続的な認証情報を使用して署名されている場合は、最大 36 時間まで有効。
+ **IAM ユーザー** – AWS Signature Version 4 を使用している場合は、最大 7 日間まで有効。

  最大 7 日間有効の署名付き URL を作成するには、まず、使用する SDK への IAM ユーザー認証情報 (アクセスキーとシークレットキー) の委任を行います。次に、AWS Signature Version 4 を使用して署名付き URL を生成します。

**注記**  
一時トークンを使用して作成した署名付き URL において、URL の有効期限の終了より先にそのトークンが有効期限切れになった場合は、URL も失効します。
署名付き URL は、その URL を保有しているすべてのユーザーに S3 on Outposts バケットへのアクセスを許可するため、適切な保護を行うことをお勧めします。署名付き URL の保護の詳細については、「[署名付き URL 機能の制限](#S3OutpostsPresignedUrlUploadObjectLimitCapabilities)」を参照してください。

## S3 on Outposts は、どのタイミングで署名付き URL の有効期限切れの日時を確認しますか?
<a name="S3Outpostspresigned-url-when-checked"></a>

S3 on Outposts は、HTTP リクエスト時に署名付き URL の有効期限日時を確認します。例えば、有効期限が切れる時刻の直前にクライアントが大きなファイルのダウンロードを開始した場合は、ダウンロード中に有効期限時刻が経過しても、そのダウンロードは継続されます。しかし、接続が中断し、クライアントがダウンロードを再開しようとした時点で有効期限切れの時刻が経過している場合には、そのダウンロードは失敗します。

署名付き URL を使用してオブジェクトを共有またはアップロードする方法の詳細については、次のトピックを参照してください。

**Topics**
+ [

## 署名付き URL 機能の制限
](#S3OutpostsPresignedUrlUploadObjectLimitCapabilities)
+ [

## 署名付き URL を作成できるユーザー
](#S3Outpostswho-presigned-url)
+ [

## S3 on Outposts は、どのタイミングで署名付き URL の有効期限切れの日時を確認しますか?
](#S3Outpostspresigned-url-when-checked)
+ [

# 署名付き URL を使用したオブジェクトの共有
](S3OutpostsShareObjectPresignedURL.md)
+ [

# S3 on Outposts バケットにオブジェクトをアップロードするための署名付き URL の生成
](S3OutpostsPresignedUrlUploadObject.md)

# 署名付き URL を使用したオブジェクトの共有
<a name="S3OutpostsShareObjectPresignedURL"></a>

バケットポリシーを更新せずに、Outpost にローカルに保存されているオブジェクトへの時間制限付きのアクセス許可を付与するには、事前署名付きの URL を使用します。署名付き URL を使用すると、バケット所有者は仮想プライベートクラウド (VPC) 内の個人とオブジェクトを共有したり、オブジェクトをアップロードまたは削除する権限を、これらのユーザーに付与したりできます。

AWS SDK または AWS Command Line Interface(AWS CLI) を使用して署名付き URL を作成する際には、その URL に対し特定のアクションを関連付けます。また、1 秒から 7 日まで指定可能なカスタム有効期限を選択して、署名付き URL に対し期間制限付きのアクセス許可を付与できます。署名付き URL を共有すると、VPC 内のユーザーは署名元のユーザーと同じように、URL に埋め込まれたアクションを実行できるようになります。この URL は有効期限が切れると失効し、以後は機能しなくなります。



署名付き URL を作成する場合には、ご自身のセキュリティ認証情報を設定し、さらに次の情報を指定する必要があります。
+ Outposts バケット上の Amazon S3 アクセスポイントの Amazon リソースネーム (ARN)
+ オブジェクトキー
+ HTTP メソッド (オブジェクトをダウンロードするための `GET`)
+ 有効期限の終了日時

署名付き URL は、指定した期間内でのみ有効です。つまり、有効期限が切れる日時の前に、URL で許可されているアクションを開始する必要があります。有効期限が切れる日時までは、署名付き URL を複数回使用できます。一時トークンを使用して署名付き URL を作成した場合、トークンが有効期限切れになると、URL の有効期限より前であってもその URL は失効します。

署名付き URL へのアクセス権を持つ仮想プライベートクラウド (VPC) のユーザーは、このオブジェクトにアクセスできます。例えば、プライベートのバケット内にプライベートの動画を格納している場合は、署名付き URL を生成することで、その動画を他ユーザーと共有できます。署名付き URL は、その URL を保有するすべてのユーザーに S3 on Outposts バケットへのアクセス許可を付与するため、この URL には適切な保護を行うことをお勧めします。署名付き URL の保護の詳細については、[署名付き URL 機能の制限](S3OutpostsPresignedURL.md#S3OutpostsPresignedUrlUploadObjectLimitCapabilities) を参照してください。

有効なセキュリティ認証情報を持つすべてのユーザーが、署名付き URL を作成できます。ただし、署名付き URL の基となるオペレーションを実行するアクセス許可を持つユーザーが、その署名付き URL を作成する必要があります。詳細については、「[署名付き URL を作成できるユーザー](S3OutpostsPresignedURL.md#S3Outpostswho-presigned-url)」を参照してください。

AWS SDK とAWS CLI を使用すると、S3 on Outposts バケット内にあるオブジェクトを共有するための署名付き URL を生成できます。詳細については、以下の例を参照してください。

## AWS SDK の使用
<a name="S3OutpostsShareObjectPreSignedURLSDK"></a>

AWS SDK を使用して署名付き URL を生成します。この URL を他ユーザーに配布すると、そのユーザーがオブジェクトを取得できるようになります。

**注記**  
署名付き URL の生成に AWS SDK を使用した場合、その署名付き URL の最大有効期限は、作成時点から 7 日間となります。

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

**Example**  
次のサンプルコードは、署名付き URL を生成します。この URL は、Outposts バケット上の S3 からオブジェクトを取得可能にするために他のユーザーに配布できます。詳細については、「[S3 on Outposts での署名付き URL の使用](S3OutpostsPresignedURL.md)」を参照してください。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。  

```
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**  
次のサンプルコードは、署名付き URL を生成します。この URL は、Outposts バケット上の S3 からオブジェクトを取得可能にするために他のユーザーに配布できます。詳細については、「[S3 on Outposts での署名付き URL の使用](S3OutpostsPresignedURL.md)」を参照してください。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。  

```
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 ]

次の例では、SDK for Python (Boto3) を使用して、オブジェクトを共有するための署名付き URL を生成しています。例えば、Boto3 クライアントおよび `generate_presigned_url` 関数を使用して、オブジェクトを `GET` する署名付き URL を生成します。

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

SDK for Python (Boto3) を使用して署名付き URL を生成する方法については、「*AWS SDK for Python (Boto) API リファレンス*」の「[Python](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url)」を参照してください。

------

## の使用AWS CLI
<a name="S3OutpostsShareObjectPresignedCLI"></a>

次の例では、AWS CLI コマンドにより、S3 on Outposts バケットのための署名付き URL を生成します。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。

**注記**  
署名付き URL の作成に AWS CLI を使用した場合、その署名付き URL の最大有効期限は、作成時点から 7 日間になります。

```
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
```

詳細については、 「AWS CLI コマンドリファレンス」の「[presign](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/presign.html)」を参照してください。

# S3 on Outposts バケットにオブジェクトをアップロードするための署名付き URL の生成
<a name="S3OutpostsPresignedUrlUploadObject"></a>

バケットポリシーを更新せずに、Outpost にローカルに保存されているオブジェクトへの時間制限付きのアクセス許可を付与するには、事前署名付きの URL を使用します。署名付き URL を使用すると、バケット所有者は仮想プライベートクラウド (VPC) 内の個人とオブジェクトを共有したり、オブジェクトをアップロードまたは削除する権限を、これらのユーザーに付与したりできます。

AWS SDK または AWS Command Line Interface(AWS CLI) を使用して署名付き URL を作成する際には、その URL に対し特定のアクションを関連付けます。また、1 秒から 7 日まで指定可能なカスタム有効期限を選択して、署名付き URL に対し期間制限付きのアクセス許可を付与できます。署名付き URL を共有すると、VPC 内のユーザーは署名元のユーザーと同じように、URL に埋め込まれたアクションを実行できるようになります。この URL は有効期限が切れると失効し、以後は機能しなくなります。

署名付き URL を作成する場合には、ご自身のセキュリティ認証情報を設定し、さらに次の情報を指定する必要があります。
+ Outposts バケット上の Amazon S3 アクセスポイントの Amazon リソースネーム (ARN)
+ オブジェクトキー
+ HTTP メソッド (オブジェクトをアップロードするための `PUT`)
+ 有効期限の終了日時

署名付き URL は、指定した期間内でのみ有効です。つまり、有効期限が切れる日時の前に、URL で許可されているアクションを開始する必要があります。有効期限が切れる日時までは、署名付き URL を複数回使用できます。一時トークンを使用して署名付き URL を作成した場合、トークンが有効期限切れになると、URL の有効期限より前であってもその URL は失効します。

マルチパートアップロードなど、複数のステップで構成されているアクションでは、すべてのステップを有効期限が切れる前に開始する必要があります。有効期限が切れた URL を使用して、S3 on Outposts がステップの開始を試みた場合は、エラーが発生します。

署名付き URL へのアクセス権を持つ仮想プライベートクラウド (VPC) 内のユーザーは、オブジェクトをアップロードすることが可能です。例えば、署名付き URL にアクセスできる VPC 内のユーザーは、お客様のバケットへのオブジェクトのアップロードが可能です。署名付き URL は、その URL を保有するすべてのユーザーに対し、S3 on Outposts バケットへのアクセスを許可するため、これらの URL には適切な保護を行うことをお勧めします。署名付き URL の保護の詳細については、[署名付き URL 機能の制限](S3OutpostsPresignedURL.md#S3OutpostsPresignedUrlUploadObjectLimitCapabilities) を参照してください。

有効なセキュリティ認証情報を持つすべてのユーザーが、署名付き URL を作成できます。ただし、署名付き URL の基となるオペレーションを実行するアクセス許可を持つユーザーが、その署名付き URL を作成する必要があります。詳細については、「[署名付き URL を作成できるユーザー](S3OutpostsPresignedURL.md#S3Outpostswho-presigned-url)」を参照してください。

## AWS SDK を使用した S3 on Outposts オブジェクトオペレーションへの署名付き URL の生成
<a name="s3-outposts-presigned-urls-upload-examples"></a>

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

**SDK for Java 2.x**  
この例では、限られた時間内に S3 on Outposts バケットにオブジェクトをアップロードするために使用できる、署名付き URL を生成する方法を説明します。詳細については、「[S3 on Outposts での署名付き URL の使用](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 ]

**SDK for Python (Boto3)**  
S3 on Outposts アクションを期間限定で実行できる署名付き URL の生成方法を示します。詳細については、「[S3 on Outposts での署名付き URL の使用](S3OutpostsPresignedURL.md)」を参照してください。この URL でリクエストを行うには、`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()
```

------