

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for Rust を使用した署名付き URL の作成
<a name="presigned-urls"></a>

 一部の AWS API オペレーションのリクエストに事前署名することができるため、あとでそのリクエストを別の発信者が自身の認証情報を提示せずに利用できます。

 例えば、Jane に Amazon Simple Storage Service (Amazon S3) オブジェクトへのアクセス権限があり、そのオブジェクトへのアクセス権限を一時的に Alejandro と共有するとします。Jane は、署名付き `GetObject` リクエストを生成して Alejandro と共有できます。これにより、Jane の認証情報へのアクセスや独自の認証情報の取得を必要とせずに、オブジェクトをダウンロードできます。署名付き URL で使用される認証情報は Jane のものです。これは、URL を生成した AWS ユーザーが Jane であるためです。

Amazon S3 における署名付き URL の詳細については、「*Amazon Simple Storage Service ユーザーガイド*」の「[署名付き URL の使用](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)」を参照してください。

## 事前署名の基本
<a name="presign-basics"></a>

 AWS SDK for Rust は、署名付きリクエストを取得するために使用できるオペレーション fluent-builder の `presigned()` メソッドを提供します。

 次の例では、Amazon S3 の署名付きの `GetObject` リクエストを作成します。このリクエストは、作成後 5 分間有効です。

```
use std::time::Duration;
use aws_config::BehaviorVersion;
use aws_sdk_s3::presigning::PresigningConfig;

let config = aws_config::defaults(BehaviorVersion::latest())
    .load()
    .await;

let s3 = aws_sdk_s3::Client::new(&config);

let presigned = s3.get_object()
    .presigned(
        PresigningConfig::builder()
            .expires_in(Duration::from_secs(60 * 5))
            .build()
            .expect("less than one week")
    )
    .await?;
```

 `presigned()` メソッドは `Result<PresignedRequest, SdkError<E, R>>` を返します。

返される `PresignedRequest` には、メソッド、URI、ヘッダーを含む HTTP リクエストのコンポーネントを取得するメソッドが含まれています。リクエストを有効にするには (存在する場合)、これらのすべてがサービスに送信されている必要があります。ただし、署名付きリクエストの多くは URI のみで表すことができます。

## `POST` および `PUT` リクエストの事前署名
<a name="presign-post-put"></a>

 事前署名可能なオペレーションの多くは URL のみを必要とし、HTTP `GET` リクエストとして送信する必要があります。ただし、一部のオペレーションには本文が必要で、場合によってはヘッダーと共に HTTP `POST` または HTTP `PUT` リクエストとして送信する必要があります。これらのリクエストの事前署名は `GET` リクエストの事前署名と同じですが、署名付きリクエストの呼び出しはさらに複雑です。

 以下は、Amazon S3 `PutObject` リクエストに事前署名して、選択した HTTP クライアントを使用して送信可能な [https://docs.rs/http/latest/http/request/struct.Request.html](https://docs.rs/http/latest/http/request/struct.Request.html) に変換する例です。

`into_http_1x_request()` メソッドを使用するには、`Cargo.toml` ファイルの `aws-sdk-s3` クレートに `http-1x` 機能を追加します。

```
aws-sdk-s3 = { version = "1", features = ["http-1x"] }
```

ソースファイル:

```
let presigned = s3.put_object()
    .presigned(
        PresigningConfig::builder()
            .expires_in(Duration::from_secs(60 * 5))
            .build()
            .expect("less than one week")
    )
    .await?;


let body = "Hello AWS SDK for Rust";
let http_req = presigned.into_http_1x_request(body);
```

## スタンドアロン署名者
<a name="standalone-signer"></a>

**注記**  
これは高度なユースケースです。ほとんどのユーザーには不要または推奨されません。

一部のユースケースでは、SDK for Rust コンテキストの外部で、署名付きリクエストを作成する必要があります。そのため、SDK とは別に [https://docs.rs/aws-sigv4/latest/aws_sigv4/index.html](https://docs.rs/aws-sigv4/latest/aws_sigv4/index.html) クレートを使用できます。

 以下の例は、基本的な要素を示しています。詳細については、クレートのドキュメントを参照してください。

以下は、`aws-sigv4` および `http` クレートを `Cargo.toml` ファイルに追加しています。

```
[dependencies]
aws-sigv4 = "1"
http = "1"
```

ソースファイル:

```
use aws_smithy_runtime_api::client::identity::Identity;
use aws_sigv4::http_request::{sign, SigningSettings, SigningParams, SignableRequest};
use aws_sigv4::sign::v4;
use std::time::SystemTime;

// Set up information and settings for the signing.
// You can obtain credentials from `SdkConfig`.
let identity = Credentials::new(
    "AKIDEXAMPLE",
    "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY",
    None,
    None,
    "hardcoded-credentials").into();

let settings = SigningSettings::default();

let params = v4::SigningParams::builder()
    .identity(&identity)
    .region("us-east-1")
    .name("service")
    .time(SystemTime::now())
    .settings(settings)
    .build()?
    .into();

// Convert the HTTP request into a signable request.
let signable = SignableRequest::new(
    "GET",
    "https://some-endpoint.some-region.amazonaws.com",
    std::iter::empty(),
    SignableBody::UnsignedPayload
)?;

// Sign and then apply the signature to the request.
let (signing_instructions, _signature) = sign(signable, &params)?.into_parts();

let mut my_req = http::Request::new("...");
signing_instructions.apply_to_request_http1x(&mut my_req);
```