No RegionEndpoint or ServiceURL configured

.NetAmazon Web-ServicesAmazon S3Aws SdkAws Sdk-Net

.Net Problem Overview


I am writing code to upload files to AWS S3 and receiving this exception:

> AmazonClientException: No RegionEndpoint or ServiceURL configured

My code:

Console.WriteLine("ready to upload");
AWSCredentials credentials;
credentials = new BasicAWSCredentials(accessKeyID.Trim(), secretKey.Trim());
AmazonS3Client s3Client = new AmazonS3Client(accessKeyID.Trim(), secretKey.Trim(), Amazon.RegionEndpoint.USEast1);
Console.WriteLine("Successful verification");
Console.WriteLine("Check if the bucket exists");
if (!CheckBucketExists(s3Client, bucketName))
{
    s3Client.PutBucket(bucketName);
    Console.WriteLine("create bucket");
}
TransferUtility utility = new TransferUtility();
Console.WriteLine("Upload  Directory......");
//exception here
utility.UploadDirectory(@"E:\telerikFile\13ginabdfglil.com", bucketName);

The exception:

Amazon.Runtime.AmazonClientException: No RegionEndpoint or ServiceURL configured
  Amazon.Runtime.ClientConfig.Validate()
  Amazon.S3.AmazonS3Config.Validate()
  Amazon.Runtime.AmazonServiceClient..ctor(AWSCredentials credentials, ClientConfig config)
  Amazon.S3.AmazonS3Client..ctor()
  Amazon.S3.Transfer.TransferUtility..ctor()
  Telerik2Amazon.Program.UploadFile()

What should I do?

.Net Solutions


Solution 1 - .Net

The short answer to error...

> Amazon.Runtime.AmazonClientException: No RegionEndpoint or ServiceURL configured

...in my case was to specify a region when constructing the client object (for me it was AmazonSimpleEmailServiceClient).

Assuming you're using BasicAWSCredentials then try this:

var credentials = new BasicAWSCredentials(accessKeyID, secretKey);

new AmazonS3Client(credentials, RegionEndpoint.USEast1);

//                              ^^^^^^^^^^^^^^^^^^^^^^  add this

Solution 2 - .Net

First of all, you shouldn't hardcode aws credentials.

I had a similar error. Turned out it was due to changes in .Net Core:

> One of the biggest changes in .NET Core is the removal of ConfigurationManager and the standard app.config and web.config files > > https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-netcore.html

For quick and dirty approach you can create credintial profile file on your machine see https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html

e.g. C:\Users\<USERNAME>\.aws\credentials on Windows

[default]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key

then in your code you can just do something like:

var dbClient = new AmazonDynamoDBClient(new StoredProfileAWSCredentials(), 
                     RegionEndpoint.USEast1);

A more involved way is: https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-netcore.html#net-core-configuration-builder

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}

appsettings.Development.json

{
  "AWS": {
    "Profile": "local-test-profile",
    "Region": "us-west-2"
  }
}


var options = Configuration.GetAWSOptions();
IAmazonS3 client = options.CreateServiceClient<IAmazonS3>();

Solution 3 - .Net

In Asp.Net this error can be fixed by adding this line to Web.config:

<add key="AWSRegion" value="us-east-1" />

Worked for me for AWSSDK.SimpleEmail v3.3

Solution 4 - .Net

I received this error when running tests for a Lambda that uses the S3 client. I resolved the error by simply providing a default profile with a region defined in ~/.aws/config:

[default]
region = us-west-1

No Lambda code changes needed. Of course YMMV depending on your circumstances.

Solution 5 - .Net

My access key id and secret key are can be used.
Therefore I give up using TransferUtility Class and chosing another Class named PutObjectRequest to upload my files
attontion: PutObjectRequest’s Property Key,it's directory name and file name must equal to local files' directory name and file name.
codes here:

        String s3Path = "987977/Baby.db";
        Console.WriteLine("Ready to upload");
        AWSCredentials credentials;
        credentials = new BasicAWSCredentials(accessKeyID.Trim(), secretKey.Trim());
        AmazonS3Client s3Client = new AmazonS3Client(accessKeyID.Trim(), secretKey.Trim(), Amazon.RegionEndpoint.USEast1);
        Console.WriteLine("Successful verification");
        Console.WriteLine("Check: if the bucket exists");
        if (!CheckBucketExists(s3Client, bucketName))
        {
            s3Client.PutBucket(bucketName);
            Console.WriteLine("Creat bucket");
        }
        string localPath = @"E:\telerikFile\987977\Baby.db";
        PutObjectRequest obj = new PutObjectRequest();
        var fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read);
  //      obj.FilePath= @"E:\telerikFile\987977\Baby.db";
        obj.InputStream = fileStream;
        obj.BucketName = bucketName;
        obj.Key = s3Path;
       // obj.ContentBody = "This is sample content...";
        obj.CannedACL = S3CannedACL.PublicRead;
        Console.WriteLine("uploading");
        // default to set public right  
        s3Client.PutObject(obj);

Solution 6 - .Net

Starting from .NET Core, there's no longer a web.config or app.config, instead the ConfigurationBuilder is used, which can retrieve configuration from a number of different sources.

The web templates for .NET use Host.CreateDefaultBuilder(args) which relies on environment variables and the appsettings.json file, for other applications the following can be done:

IConfiguration configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile(APPSETTINGS, optional: false, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

This will retrieve configuration from the appsettings.json file, but also from environment variables, and allows you to retrieve them as follows:

var region = configuration["AWS_REGION"];

The AWS SDK will use this configuration to retrieve the region for services retreived through Dependency Injection in any ASP.NET Core application. For Lambda's you'll need to construct a ServiceCollection manually for that to work, which can be done as such.

private readonly ServiceProvider serviceProvider;

public Function()
{
	var serviceCollection = new ServiceCollection();
	serviceCollection.AddSingleton<IAmazonDynamoDB, AmazonDynamoDBClient>();
	serviceProvider = serviceCollection.BuildServiceProvider();
}

public void FunctionHandler(string input, LambdaContext context)
{
	var dynamodb = serviceProvider.GetService<IAmazonDynamoDB>();
	// Business logic here
}

This approach should be sufficient for pretty much every use-case. If you're having issues with this, please try to troubleshoot that rather than attempt the fall-back below.

This next bit is only here for completeness, but you really shouldn't need it.

When using the above fails, you can fall back on the AWSConfigs static to set your environment variables explicitly. Using the below approach allows us to reuse our existing configuration, whether that is in the appsettings.json or in the Environment variables.

AWSConfigs.AWSRegion = configuration["AWS_REGION"];

Solution 7 - .Net

I also have this issue and nothing was helpful, aws is the worst, so complicated and their documentation is subpar that of microsft's no wonder Azure is taking marketshare

Solution 8 - .Net

If you are using TransferUtility() try this:

var credentials = new BasicAWSCredentials(accessKeyID, secretKey);

var S3Client = new AmazonS3Client(credentials, RegionEndpoint.USEast1);

this._transferUtility = new TransferUtility(S3Client);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionxiehongguangView Question on Stackoverflow
Solution 1 - .NetDrew NoakesView Answer on Stackoverflow
Solution 2 - .NetNeilView Answer on Stackoverflow
Solution 3 - .NetsafinilnurView Answer on Stackoverflow
Solution 4 - .NetJake StoefflerView Answer on Stackoverflow
Solution 5 - .NetxiehongguangView Answer on Stackoverflow
Solution 6 - .NetNino van der MarkView Answer on Stackoverflow
Solution 7 - .NetBogdan BanciuView Answer on Stackoverflow
Solution 8 - .NetGRDView Answer on Stackoverflow