it-swarm.com.ru

AWS не удалось проверить предоставленные учетные данные для доступа

Я пытался создать группу безопасности с помощью AWS SDK, но почему-то не удается ее аутентифицировать. Для конкретного ключа доступа и секретного ключа я предоставил права администратора, а затем он не проходит проверку. С другой стороны, я попробовал те же учетные данные на примере AWS S3, он успешно выполняется.

Получение следующей ошибки при создании группы безопасности:

com.amazonaws.AmazonServiceException: AWS was not able to validate the provided access credentials (Service: AmazonEC2; Status Code: 401; Error Code: AuthFailure; Request ID: 1584a035-9a88-4dc7-b5e2-a8b7bde6f43c)
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.Java:1077)
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.Java:725)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.Java:460)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.Java:295)
    at com.amazonaws.services.ec2.AmazonEC2Client.invoke(AmazonEC2Client.Java:9393)
    at com.amazonaws.services.ec2.AmazonEC2Client.createSecurityGroup(AmazonEC2Client.Java:1146)
    at com.sunil.demo.ec2.SetupEC2.createSecurityGroup(SetupEC2.Java:84)
    at com.sunil.demo.ec2.SetupEC2.main(SetupEC2.Java:25)

Вот код Java:

public class SetupEC2 {
    AWSCredentials credentials = null;
    AmazonEC2Client amazonEC2Client ;

    public static void main(String[] args) {
        SetupEC2 setupEC2Instance = new SetupEC2();
        setupEC2Instance.init();
        setupEC2Instance.createSecurityGroup();
    }

    public void init(){
        // Intialize AWS Credentials
        try {
            credentials = new BasicAWSCredentials("XXXXXXXX", "XXXXXXXXX");
        } catch (Exception e) {
            throw new AmazonClientException(
                    "Cannot load the credentials from the credential profiles file. " +
                            "Please make sure that your credentials file is at the     correct " +
                            "location (/home/sunil/.aws/credentials), and is in valid format.",
                            e);
        }

        // Initialize EC2 instance
        try {
            amazonEC2Client = new AmazonEC2Client(credentials);
            amazonEC2Client.setEndpoint("ec2.ap-southeast-1.amazonaws.com");
            amazonEC2Client.setRegion(Region.getRegion(Regions.AP_SOUTHEAST_1));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public boolean createSecurityGroup(){
        boolean securityGroupCreated = false;
        String groupName = "sgec2securitygroup";
        String sshIpRange = "0.0.0.0/0";
        String sshprotocol = "tcp";
        int sshFromPort = 22;
        int sshToPort =22;

        String httpIpRange = "0.0.0.0/0";
        String httpProtocol = "tcp";
        int httpFromPort = 80;
        int httpToPort = 80;

        String httpsIpRange = "0.0.0.0/0";
        String httpsProtocol = "tcp";
        int httpsFromPort = 443;
        int httpsToProtocol = 443;

        try {
            CreateSecurityGroupRequest createSecurityGroupRequest =  new CreateSecurityGroupRequest();
            createSecurityGroupRequest.withGroupName(groupName).withDescription("Created from AWS SDK Security Group");
            createSecurityGroupRequest.setRequestCredentials(credentials);

            CreateSecurityGroupResult csgr = amazonEC2Client.createSecurityGroup(createSecurityGroupRequest);

            String groupid = csgr.getGroupId();
            System.out.println("Security Group Id : " + groupid);

            System.out.println("Create Security Group Permission");
            Collection<IpPermission> ips = new ArrayList<IpPermission>();
            // Permission for SSH only to your ip
            IpPermission ipssh = new IpPermission();
        ipssh.withIpRanges(sshIpRange).withIpProtocol(sshprotocol).withFromPort(sshFromPort).withToPort(sshToPort);
            ips.add(ipssh);

            // Permission for HTTP, any one can access
            IpPermission iphttp = new IpPermission();
        iphttp.withIpRanges(httpIpRange).withIpProtocol(httpProtocol).withFromPort(httpFromPort).withToPort(httpToPort);
            ips.add(iphttp);

            //Permission for HTTPS, any one can accesss
            IpPermission iphttps = new IpPermission();
            iphttps.withIpRanges(httpsIpRange).withIpProtocol(httpsProtocol).withFromPort(httpsFromPort).withToPort(httpsToProtocol);
            ips.add(iphttps);

            System.out.println("Attach Owner to security group");
            // Register this security group with owner
            AuthorizeSecurityGroupIngressRequest authorizeSecurityGroupIngressRequest = new AuthorizeSecurityGroupIngressRequest();
            authorizeSecurityGroupIngressRequest.withGroupName(groupName).withIpPermissions(ips);
            amazonEC2Client.authorizeSecurityGroupIngress(authorizeSecurityGroupIngressRequest);
        securityGroupCreated = true;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            securityGroupCreated = false;
        }
        System.out.println("securityGroupCreated: " + securityGroupCreated);
        return securityGroupCreated;
    }
}
13
Sunil Gulabani

Попробуйте обновить системное время.

Если разница между AWS-datetime и вашим datetime слишком велика, учетные данные не принимаются.

Для пользователей Debian/Ubuntu:

когда вы никогда не устанавливаете часовой пояс, вы можете сделать это с

Sudo dpkg-reconfigure tzdata

Остановите службу ntp, поскольку слишком большие различия во времени не могут быть изменены при запуске службы.

Sudo /etc/init.d/ntp stop

Синхронизируйте время и дату (-q Установите время и выйдите из режима/Выполнить только один раз) (-g Разрешить первую настройку, чтобы быть большой) (-x Поворот до 600 секунд/Настроить также время с большими различиями) (-n Не делать форк/процесс не пойдет на задний план)

Sudo ntpd -q -g -x -n

Перезапустить сервис

Sudo /etc/init.d/ntp start

проверить фактическую дату системы

Sudo date

установите system-datetime на ваше оборудование-datetime

Sudo hwclock --systohc

покажи свое оборудование-дата-время

Sudo hwclock
18
M. Röthenmund

Если вы введете свои учетные данные в ~/.aws/credentials, вам не нужно будет указывать параметр для вызова AmazonEC2Client. Если вы сделаете это, то на экземпляре EC2 тот же код будет работать с предполагаемыми ролями STS.

Для получения дополнительной информации см .: http://docs.aws.Amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/credentials.html

0
ozOli

«Ошибка клиента (AuthFailure) при вызове операции [Заполнить пропуски]: AWS не удалось проверить предоставленные учетные данные доступа»

  1. Если вы уверены в достоверности учетных данных AWS, т. Е. Ключа доступа, секретного ключа и соответствующего имени профиля, ваша дата и время не в курсе - очень хороший виновник.

  2. В моем случае я был уверен, но был неправ - я использовал не те ключи. Не больно перепроверить.

  3. Допустим, вы создали пользователя IAM с именем «guignol». Сконфигурируйте "guignol" в ~/.aws/config следующим образом:

    [profile guignol] region = us-east-1 aws-access-key_id = AKXXXYYY... aws-secret-key-access = ...

Установите aws cli (интерфейс уровня команд), если вы этого еще не сделали. В качестве теста запустите aws ec2 description-instances --profile guignol Если вы получили сообщение об ошибке, в котором aws не смогла проверить учетные данные, запустите aws configure --profile guignol , введите свои учетные данные и снова запустите тестовую команду.

0
Vietnhi Phuvan