Не настроено RegionEndpoint или ServiceURL

Я пишу код для загрузки файлов в AWS S3 и получаю это исключение:

AmazonClientException: не настроено RegionEndpoint или ServiceURL

Мой код:

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);

Исключение:

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()

Что я должен делать?

Для таких сервисов, как S3 или EC2, необходимо указать конечную точку. Так что new AmazonS3Client(credentials, RegionEndpoint.USEast1) должно работать.   —  person xiehongguang    schedule 21.07.2020

См. также:  Предоставить Amazon ML разрешение на чтение из Amazon S3 программно
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 6
  1. xiehongguang

    Можно использовать мой идентификатор ключа доступа и секретный ключ.
    Поэтому я отказываюсь от использования класса TransferUtility и выбираю другой класс с именем PutObjectRequest для загрузки моих файлов
    attontion: свойство PutObjectRequest Key , имя каталога и имя файла должны совпадать с именем каталога и имени файла локальных файлов.
    здесь коды:

            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);
    
  2. xiehongguang

    Краткий ответ на ошибку …

    Amazon.Runtime.AmazonClientException: не настроен RegionEndpoint или ServiceURL

    … в моем случае было указать регион при построении клиентского объекта (для меня это было AmazonSimpleEmailServiceClient).

    Предполагая, что вы используете BasicAWSCredentials, попробуйте следующее:

    var credentials = new BasicAWSCredentials(accessKeyID, secretKey);
    
    new AmazonS3Client(credentials, RegionEndpoint.USEast1);
    
    //                              ^^^^^^^^^^^^^^^^^^^^^^  add this
    
  3. xiehongguang

    Если вы используете TransferUtility(), попробуйте следующее:

    var credentials = new BasicAWSCredentials(accessKeyID, secretKey);
    
    var S3Client = new AmazonS3Client(credentials, RegionEndpoint.USEast1);
    
    this._transferUtility = new TransferUtility(S3Client);
    
  4. xiehongguang

    В Asp.Net эту ошибку можно исправить, добавив эту строку в Web.config:

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

    У меня работал для AWSSDK.SimpleEmail v3.3

    Вместо этого используйте /.aws/credentials файл. Его легко создать с помощью Visual Studio AWS Toolkit. Это имеет смысл, потому что при развертывании экземпляр EC2 / Lambda использует метаданные ролей и получает всю необходимую информацию. Извините -1, потому что люди затем копируют и вставляют это, не понимая, как работают учетные данные AWS (например, я) person xiehongguang; 05.02.2021

  5. xiehongguang

    Прежде всего, вам не следует жестко кодировать учетные данные aws.

    У меня была аналогичная ошибка. Оказалось, это из-за изменений в .Net Core:

    Одним из самых больших изменений в .NET Core является удаление ConfigurationManager и стандартных файлов app.config и web.config.

    https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-netcore.html.

    Для быстрого и грязного подхода вы можете создать файл достоверного профиля на своем компьютере, см. https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html

    например C:\Users\<USERNAME>\.aws\credentials в Windows

    [default]
    aws_access_key_id = your_access_key_id
    aws_secret_access_key = your_secret_access_key
    

    тогда в своем коде вы можете просто сделать что-то вроде:

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

    Более сложный способ: 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>();
    

    По-прежнему следует избегать жесткого кодирования региона … потому что, если вы переместите его в Европу или Азию … вы будете подключаться не к тому устройству. В AWS он просто использует доступ к ролям и регионам исполняемого кода. Профили действительно существуют, чтобы переопределить это, если необходимо … но это редко бывает — используйте более сложный способ, который действительно является более предпочтительным способом … и не такой сложный person xiehongguang; 05.02.2021

    Проблема, которую я обнаружил, заключается в том, что мне нужно было использовать метод DryRun () из AmazonEC2Client, который недоступен в IAmazonEC2. Если я попытаюсь использовать CreateServiceClient ‹T› () с AmazonEC2Client, он не сможет создать клиента, выбрасывая объект, для которого не установлена ​​эталонная ошибка :( person xiehongguang; 22.04.2021

  6. xiehongguang

    Я получил эту ошибку при запуске тестов для лямбды, использующей клиент S3. Я разрешил ошибку, просто предоставив профиль по умолчанию с регионом, определенным в ~/.aws/config:

    [default]
    region = us-west-1
    

    Изменения кода лямбда не требуется. Конечно, YMMV в зависимости от ваших обстоятельств.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: