diff --git a/cpp/src/arrow/filesystem/s3fs.cc b/cpp/src/arrow/filesystem/s3fs.cc index 62bec9b23b56f..a987d63a6d247 100644 --- a/cpp/src/arrow/filesystem/s3fs.cc +++ b/cpp/src/arrow/filesystem/s3fs.cc @@ -156,6 +156,7 @@ using internal::ToURLEncodedAwsString; static const char kSep = '/'; constexpr char kAwsEndpointUrlEnvVar[] = "AWS_ENDPOINT_URL"; +constexpr char kAwsEndpointUrlS3EnvVar[] = "AWS_ENDPOINT_URL_S3"; // ----------------------------------------------------------------------- // S3ProxyOptions implementation @@ -366,9 +367,15 @@ Result S3Options::FromUri(const Uri& uri, std::string* out_path) { } else { options.ConfigureDefaultCredentials(); } - auto endpoint_env = arrow::internal::GetEnvVar(kAwsEndpointUrlEnvVar); - if (endpoint_env.ok()) { - options.endpoint_override = *endpoint_env; + // Prefer AWS service-specific endpoint url + auto s3_endpoint_env = arrow::internal::GetEnvVar(kAwsEndpointUrlS3EnvVar); + if (s3_endpoint_env.ok()) { + options.endpoint_override = *s3_endpoint_env; + } else { + auto endpoint_env = arrow::internal::GetEnvVar(kAwsEndpointUrlEnvVar); + if (endpoint_env.ok()) { + options.endpoint_override = *endpoint_env; + } } bool region_set = false; diff --git a/cpp/src/arrow/filesystem/s3fs_test.cc b/cpp/src/arrow/filesystem/s3fs_test.cc index 487a6abb18903..33e9712a666cd 100644 --- a/cpp/src/arrow/filesystem/s3fs_test.cc +++ b/cpp/src/arrow/filesystem/s3fs_test.cc @@ -303,6 +303,11 @@ TEST_F(S3OptionsTest, FromUri) { ASSERT_RAISES(Invalid, S3Options::FromUri("s3://mybucket/?xxx=zzz", &path)); // Endpoint from environment variable + { + EnvVarGuard endpoint_guard("AWS_ENDPOINT_URL_S3", "http://127.0.0.1:9000"); + ASSERT_OK_AND_ASSIGN(options, S3Options::FromUri("s3://mybucket/", &path)); + ASSERT_EQ(options.endpoint_override, "http://127.0.0.1:9000"); + } { EnvVarGuard endpoint_guard("AWS_ENDPOINT_URL", "http://127.0.0.1:9000"); ASSERT_OK_AND_ASSIGN(options, S3Options::FromUri("s3://mybucket/", &path)); diff --git a/docs/source/cpp/env_vars.rst b/docs/source/cpp/env_vars.rst index f116effeb258e..0fa80aa1106c1 100644 --- a/docs/source/cpp/env_vars.rst +++ b/docs/source/cpp/env_vars.rst @@ -163,6 +163,13 @@ that changing their value later will have an effect. .. envvar:: AWS_ENDPOINT_URL Endpoint URL used for S3-like storage, for example Minio or s3.scality. + Alternatively, one can set :envvar:`AWS_ENDPOINT_URL_S3`. + +.. envvar:: AWS_ENDPOINT_URL_S3 + + Endpoint URL used for S3-like storage, for example Minio or s3.scality. + This takes precedence over :envvar:`AWS_ENDPOINT_URL` if both variables + are set. .. envvar:: GANDIVA_CACHE_SIZE