AWS SDKを使用してセキュリティグループを作成しようとしましたが、どういうわけか認証に失敗します。特定のアクセスキーとシークレットキーについて、管理者権限を提供しましたが、検証に失敗します。一方、AWS S3 Exampleで同じ認証情報を試しましたが、正常に実行されました。
セキュリティグループの作成中に次のエラーが発生します。
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;
}
}
システム時刻を更新してみてください。
AWS-datetimeとdatetimeの差が大きすぎると、認証情報は受け入れられません。
Debian/Ubuntuユーザーの場合:
タイムゾーンを設定したことがない場合は、
Sudo dpkg-reconfigure tzdata
時間差が大きすぎるため、ntp-Serviceを停止します。サービスを実行しても変更できません。
Sudo /etc/init.d/ntp stop
時刻と日付を同期します(-q時刻を設定して終了します/ 1回だけ実行します)(-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
クレデンシャルを〜/ .aws/creditalsに配置する場合、AmazonEC2Client呼び出しにパラメーターを指定する必要はありません。これを行うと、EC2インスタンスでは、同じコードが想定されるSTSロールで機能します。
詳細については、以下を参照してください: http://docs.aws.Amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/credentials.html
"[Fill-in the blanks]オペレーションを呼び出すときにクライアントエラー(AuthFailure)が発生しました:AWSは提供されたアクセス認証情報を検証できませんでした"
AWS認証情報、つまりアクセスキーとシークレットキー、および対応するプロファイル名の有効性に自信がある場合は、予定外の日付と時刻が非常に良い原因です。
私の場合、自信はありましたが、間違っていました。間違ったキーを使用していました。再確認しても問題ありません。
「ギニョール」というIAMユーザーを作成したとします。 〜/ .aws/configの「guignol」を次のように設定します。
[profile guignol] region = us-east-1 aws-access-key_id = AKXXXYYY... aws-secret-key-access = ...
まだインストールしていない場合は、aws cli(コマンドレベルインターフェイス)をインストールします。テストとして、aws ec2 describe-instances --profile guignolを実行します。awsが認証情報を検証できなかったというエラーメッセージが表示された場合は、aws configure --profile guignolを実行します。 =、認証情報を入力して、テストコマンドを再実行します。