AWS SDK for Rust를 사용하여 미리 서명된 URL 생성
나중에 다른 호출자가 자신의 자격 증명을 제시하지 않고도 요청을 사용할 수 있도록 일부 AWS API 작업에 대한 요청을 미리 서명할 수 있습니다.
예를 들어 Jane이 Amazon Simple Storage Service(Amazon S3) 객체에 대한 액세스 권한을 가지고 있고 객체에 대한 액세스 권한을 Alejandro와 일시적으로 공유하려고 할 경우, Jane은 미리 서명된 GetObject 요청을 생성하여 Alejandro와 공유할 수 있으므로 Alejandro는 Jane의 자격 증명에 액세스하거나 직접 자격 증명을 보유하지 않고도 객체를 다운로드할 수 있습니다. Jane이 URL을 생성한 AWS 사용자이므로 미리 서명된 URL에서 사용하는 자격 증명은 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
다음은 기본 요소를 보여주는 예제입니다. 자세한 내용은 크레이트 설명서를 참조하세요.
Cargo.toml 파일에 aws-sigv4 및 http 크레이트를 추가합니다.
[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);