翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS SDK for Rust を使用した署名付き URL の作成
一部の 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 の使用」を参照してください。
事前署名の基本
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 リクエストの事前署名
事前署名可能なオペレーションの多くは URL のみを必要とし、HTTP GET リクエストとして送信する必要があります。ただし、一部のオペレーションには本文が必要で、場合によってはヘッダーと共に HTTP POST または HTTP PUT リクエストとして送信する必要があります。これらのリクエストの事前署名は GET リクエストの事前署名と同じですが、署名付きリクエストの呼び出しはさらに複雑です。
以下は、Amazon S3 PutObject リクエストに事前署名して、選択した HTTP クライアントを使用して送信可能な http::request::Request
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);
スタンドアロン署名者
注記
これは高度なユースケースです。ほとんどのユーザーには不要または推奨されません。
一部のユースケースでは、SDK for Rust コンテキストの外部で、署名付きリクエストを作成する必要があります。そのため、SDK とは別に aws-sigv4
以下の例は、基本的な要素を示しています。詳細については、クレートのドキュメントを参照してください。
以下は、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, ¶ms)?.into_parts(); let mut my_req = http::Request::new("..."); signing_instructions.apply_to_request_http1x(&mut my_req);