Unverified Commit df32a55f authored by Nugine's avatar Nugine
Browse files

s3s-proxy: setup

parent 07bce808
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ macro_rules! wrap_sdk_error {
            if let Some(val) = meta.request_id() {
                err.set_request_id(val);
            }
            err.set_status_code(e.raw().http().status());
        }
        err.set_source(Box::new(source));

+17 −0
Original line number Diff line number Diff line
[package]
name = "s3s-proxy"
version = "0.0.0"
edition = "2021"
publish = false

[dependencies]
aws-config = "0.53.0"
aws-credential-types = "0.53.0"
aws-sdk-s3 = "0.23.0"
clap = { version = "4.1.1", features = ["derive"] }
hyper = { version = "0.14.23", features = ["full"] }
s3s = { version = "0.2.0-dev", path = "../s3s" }
s3s-aws = { version = "0.2.0-dev", path = "../s3s-aws" }
tokio = { version = "1.24.2", features = ["full"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3.16", features = ["env-filter", "time"] }
+74 −0
Original line number Diff line number Diff line
#![forbid(unsafe_code)]
#![deny(clippy::all)]

use s3s::service::S3Service;
use s3s::SimpleAuth;

use std::error::Error;
use std::net::TcpListener;

use aws_credential_types::provider::ProvideCredentials;

use clap::Parser;
use hyper::server::Server;
use tracing::info;

#[derive(Debug, Parser)]
struct Opt {
    #[clap(long, default_value = "localhost")]
    host: String,

    #[clap(long, default_value = "8014")]
    port: u16,

    #[clap(long)]
    domain_name: Option<String>,

    #[clap(long)]
    endpoint_url: String,
}

fn setup_tracing() {
    use tracing_subscriber::EnvFilter;

    tracing_subscriber::fmt()
        .pretty()
        .with_env_filter(EnvFilter::from_default_env())
        .init()
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
    setup_tracing();
    let opt = Opt::parse();

    // Setup S3 service
    let conf = aws_config::from_env().endpoint_url(&opt.endpoint_url).load().await;
    let proxy = s3s_aws::Proxy::from(aws_sdk_s3::Client::new(&conf));
    let mut service = S3Service::new(Box::new(proxy));

    // Enable authentication
    if let Some(cred_provider) = conf.credentials_provider() {
        let cred = cred_provider.provide_credentials().await?;
        let auth = SimpleAuth::from_single(cred.access_key_id(), cred.secret_access_key());
        service.set_auth(Box::new(auth));
    }

    // Enable parsing virtual-hosted-style requests
    if let Some(domain_name) = opt.domain_name {
        service.set_base_domain(domain_name);
    }

    // Run server
    let listener = TcpListener::bind((opt.host.as_str(), opt.port))?;
    let server = Server::from_tcp(listener)?.serve(service.into_shared().into_make_service());

    info!("server is running at http://{}:{}/", opt.host, opt.port);
    info!("server is forwarding requests to {}", opt.endpoint_url);
    let task = tokio::spawn(server);

    tokio::signal::ctrl_c().await?;
    task.abort();

    Ok(())
}
+2 −0
Original line number Diff line number Diff line
@@ -17,9 +17,11 @@ codegen:

install:
    cargo install --offline --path crates/s3s-fs --features binary
    cargo install --offline --path crates/s3s-proxy

sync-version:
    cargo set-version -p s3s            0.2.0-dev
    cargo set-version -p s3s-codegen    0.0.0
    cargo set-version -p s3s-fs         0.2.0-dev
    cargo set-version -p s3s-aws        0.2.0-dev
    cargo set-version -p s3s-proxy      0.0.0