J'ai essayé de créer un groupe de sécurité à l'aide du kit SDK AWS, mais il ne parvient pas à l'authentifier. Pour la clé d’accès et la clé secrète spécifiques, j’ai fourni les droits d’administrateur, mais il n’est pas valide non plus. De l'autre côté, j'ai essayé les mêmes informations d'identification sur AWS S3 Example, il s'exécute avec succès.
Obtenir l'erreur suivante lors de la création du groupe de sécurité:
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)
Voici le code 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;
}
}
Essayez de mettre à jour votre heure système.
Lorsque la différence entre AWS-datetime et votre date/heure est trop grande, les informations d'identification ne seront pas acceptées.
Pour les utilisateurs de Debian/Ubuntu:
lorsque vous ne définissez jamais votre fuseau horaire, vous pouvez le faire avec
Sudo dpkg-reconfigure tzdata
Arrêtez le service ntp, car des différences de temps trop importantes ne peuvent pas être modifiées en cours d'exécution.
Sudo /etc/init.d/ntp stop
Syncronisez votre heure et votre date (-q Réglez l’heure et quittez/Exécuter une seule fois) (-g Permet au premier ajustement d’être grand) (-x Durée jusqu’à 600 secondes/Adjuste également en cas de grandes différences) (-n Ne pas fork/processus ne va pas au fond)
Sudo ntpd -q -g -x -n
Redémarrer le service
Sudo /etc/init.d/ntp start
vérifier la date-heure réelle du système
Sudo date
définir la date-heure du système sur votre date-heure du matériel
Sudo hwclock --systohc
montrer votre date-heure matérielle
Sudo hwclock
Si vous mettez vos informations d'identification dans ~/.aws/credentials, vous n'avez pas besoin de fournir un paramètre à votre appel AmazonEC2Client. Si vous faites cela, alors sur une instance EC2, le même code fonctionnera avec les rôles Assumed STS.
Pour plus d'informations, voir: http://docs.aws.Amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/credentials.html
"Une erreur client (AuthFailure) s'est produite lors de l'appel de l'opération [Remplir les espaces]: AWS n'a pas pu valider les informations d'identification d'accès fournies"
Si vous êtes sûr de la validité des informations d'identification AWS, c'est-à-dire de la clé d'accès et de la clé secrète, ainsi que du nom de profil correspondant, votre date et votre heure d'absence de suivi sont un très bon coupable.
Dans mon cas, j'étais confiant mais j'avais tort - j'avais utilisé les mauvaises clés. Ça ne fait pas mal de vérifier.
Supposons que vous ayez créé un utilisateur IAM appelé "guignol". Configurez "guignol" dans ~/.aws/config comme suit:
[profile guignol]
region = us-east-1
aws-access-key_id = AKXXXYYY...
aws-secret-key-access = ...
Installez l'aws cli (interface de niveau commande) si vous ne l'avez pas déjà fait. En tant que test, exécutez aws ec2 describe-instances --profile guignol Si vous recevez un message d'erreur indiquant que aws n'a pas pu valider les informations d'identification, exécutez aws configure --profile guignol , entrez vos informations d'identification et Exécutez à nouveau la commande de test.