rusoto_s3でS3非公開bucketへのpresign URLを取得したので記録しておきます。
参考にしたページ
rusoto/s3.rs at master · rusoto/rusoto · GitHub
rusoto_s3 presign
で検索するも上記のテストコードしかめぼしい情報がなく、テストコードを読み進めていく。どうやらPreSignedRequest
というTraitを用いる模様。
rusoto_s3::util::PreSignedRequest - Rust
PreSignedRequest
は、コードを読み進めていくと
impl PreSignedRequest for GetObjectRequest { ... }
のようにGetObjectRequest
やPutObjectRequest
なんかのmixinになっている。
ということで、実装例。
書き込み用署名を取得する
use rusoto_core::{Region, credential::{DefaultCredentialsProvider, ProvideAwsCredentials}}; use rusoto_s3::{GetObjectRequest, PutObjectRequest, S3, S3Client, util::PreSignedRequest}; use dotenv::dotenv; pub async fn get_s3_presign_for_put_object(bucket_name: String, key:String) -> String { dotenv().ok(); let region = Region::ApNortheast1; let req = PutObjectRequest { bucket: bucket_name, key: key, ..Default::default() }; let credentials = DefaultCredentialsProvider::new() .unwrap() .credentials() .await.unwrap(); //PreSignedRequestOption expires_in: 3600 req.get_presigned_url(®ion, &credentials, &Default::default()) }
PutObjectRequest
に書き込み先のbucketとPut対象とするkeyを指定する。もちろんディレクトリ階層を表現する時はpath/to/object_name
のように/スラッシュ区切りで指定できる。
credentials
は
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
という環境変数名を見に行くので、僕の場合は.env
に記載しておいた。もちろんシェルの.profile
なんかに書いておいてもいいし、コード上でkeyを埋め込みたい場合は
std::env::set_var("AWS_ACCESS_KEY_ID", "xxxxx"); std::env::set_var("AWS_SECRET_ACCESS_KEY", "xxxxx");
とか書いておけばいいと思う笑
.aws/credentials
に定義されたprofileを指定する方法は調べていない...。
また、get_presigned_url
の3つめの引数は、コードを読む限り、PreSignedRequestOption
を渡せるみたい。PreSignedRequestOption
はexpires_in
というフィールドを持っており、デフォルトでは、Duration::from_secs(3600)
となっているので、必要に応じて署名の有効時間を調節できるようになってるみたい。試してはないけど、コード読む限りの見解です。
読み出し用署名を取得する
書き込みと同じ、PutObjectRequest
がGetObjectRequest
になるだけ。
pub async fn get_s3_presign_for_get_object(bucket_name:String, key:String) -> String { dotenv().ok(); let region = Region::ApNortheast1; let req = GetObjectRequest { bucket: bucket_name, key: key, ..Default::default() }; let credentials = DefaultCredentialsProvider::new() .unwrap() .credentials() .await.unwrap(); req.get_presigned_url(®ion, &credentials, &Default::default()) }
情報が少なくて結構調べてしまった(^^;)。まあ普段使いで署名取る分にはAWS lambda & boto3なんかでサクっとできるからね(^^;)