Skip to content

Instantly share code, notes, and snippets.

@uzresk
Last active August 29, 2015 14:09
Show Gist options
  • Save uzresk/c14bfe2b2709d50f182a to your computer and use it in GitHub Desktop.
Save uzresk/c14bfe2b2709d50f182a to your computer and use it in GitHub Desktop.
AMIのコピーを行う[SDK for Java] ref: http://qiita.com/uzresk/items/c8c0f0ab0306780b2966
package aws.ec2.ami;
import java.util.List;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.CopyImageRequest;
import com.amazonaws.services.ec2.model.CopyImageResult;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeImagesRequest;
import com.amazonaws.services.ec2.model.DescribeImagesResult;
import com.amazonaws.services.ec2.model.Image;
import com.amazonaws.services.ec2.model.Tag;
public class Ec2AmiCopy {
/**
* 第一引数で指定されたAMI imageをリージョン間コピーします。<br>
* tagの情報についても合わせてコピーします。
*
* @param args
* AMI image id
*/
public static void main(String[] args) {
String sourceImageId = args[0];
if (sourceImageId == null || "".equals(sourceImageId)) {
throw new IllegalArgumentException("instance id is null or empty.");
}
AWSCredentialsProvider provider = new ProfileCredentialsProvider("uzr");
AmazonEC2 ec2ClientTokyo2 = Region.getRegion(Regions.AP_NORTHEAST_1)
.createClient(AmazonEC2Client.class, provider,
new ClientConfiguration());
// AMIをコピーするときのプロパティを設定します。コピー元のリージョンとAMIIDを指定しています。
CopyImageRequest copyImageRequest = new CopyImageRequest();
copyImageRequest.setDescription("copy sourceImageId:" + sourceImageId);
copyImageRequest.setSourceRegion(Regions.AP_NORTHEAST_1.getName());
copyImageRequest.setRequestCredentials(provider.getCredentials());
copyImageRequest.setSourceImageId(sourceImageId);
// AMIコピーの実行
CopyImageResult copyImageResult = ec2ClientTokyo2
.copyImage(copyImageRequest);
String copyImageId = copyImageResult.getImageId();
// この時点ではリクエストが受け付けられただけです。
System.out.println(sourceImageId + "から" + copyImageId + "を作成しました。");
}
}
package aws.ec2.ami;
import java.util.List;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.CopyImageRequest;
import com.amazonaws.services.ec2.model.CopyImageResult;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeImagesRequest;
import com.amazonaws.services.ec2.model.DescribeImagesResult;
import com.amazonaws.services.ec2.model.Image;
import com.amazonaws.services.ec2.model.Tag;
public class Ec2AmiCopy {
/**
* 第一引数で指定されたAMI imageをリージョン間コピーします。<br>
* tagの情報についても合わせてコピーします。
*
* @param args
* AMI image id
*/
public static void main(String[] args) {
String sourceImageId = args[0];
if (sourceImageId == null || "".equals(sourceImageId)) {
throw new IllegalArgumentException("instance id is null or empty.");
}
AWSCredentialsProvider provider = new ProfileCredentialsProvider("uzr");
AmazonEC2 ec2ClientTokyo2 = Region.getRegion(Regions.AP_NORTHEAST_1)
.createClient(AmazonEC2Client.class, provider,
new ClientConfiguration());
// AMIをコピーするときのプロパティを設定します。コピー元のリージョンとAMIIDを指定しています。
CopyImageRequest copyImageRequest = new CopyImageRequest();
copyImageRequest.setDescription("copy sourceImageId:" + sourceImageId);
copyImageRequest.setSourceRegion(Regions.AP_NORTHEAST_1.getName());
copyImageRequest.setRequestCredentials(provider.getCredentials());
copyImageRequest.setSourceImageId(sourceImageId);
// AMIコピーの実行
CopyImageResult copyImageResult = ec2ClientTokyo2
.copyImage(copyImageRequest);
String copyImageId = copyImageResult.getImageId();
// この時点ではリクエストが受け付けられただけです。
System.out.println(sourceImageId + "から" + copyImageId + "を作成しました。");
// Tagの情報をコピー元から取得して、コピーした先のAMIに紐付けます。
AmazonEC2 ec2ClientTokyo = Region.getRegion(Regions.AP_NORTHEAST_1)
.createClient(AmazonEC2Client.class, provider,
new ClientConfiguration());
// Tagの情報を取得
DescribeImagesResult describeImagesResult = ec2ClientTokyo
.describeImages(new DescribeImagesRequest()
.withImageIds(sourceImageId));
List<Image> images = describeImagesResult.getImages();
if (images.size() != 1) {
throw new IllegalStateException("error:" + images.size());
}
Image image = images.get(0);
// AMIコピーしてできたイメージにタグを紐付けます。
for (Tag tag : image.getTags()) {
ec2ClientTokyo2.createTags(new CreateTagsRequest().withResources(
copyImageId).withTags(tag));
}
}
}
package aws.ec2.ami;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.DescribeImageAttributeRequest;
import com.amazonaws.services.ec2.model.DescribeImageAttributeResult;
import com.amazonaws.services.ec2.model.ImageAttributeName;
import com.amazonaws.services.ec2.model.LaunchPermission;
import com.amazonaws.services.ec2.model.LaunchPermissionModifications;
import com.amazonaws.services.ec2.model.ModifyImageAttributeRequest;
public class Ec2AmiLaunchPermissionCopy {
/**
* 第一引数で指定されたAMI imageに紐づく起動許可設定を<br>
* 第二引数で指定されたAMI imageにコピーします。
*/
public static void main(String[] args) {
String sourceImageId = args[0];
String destImageId = args[1];
if (sourceImageId == null || "".equals(sourceImageId)
|| destImageId == null || "".equals(destImageId)) {
throw new IllegalArgumentException("instance id is null or empty.");
}
AWSCredentialsProvider provider = new ProfileCredentialsProvider("uzr");
AmazonEC2 ec2ClientTokyo = Region.getRegion(Regions.AP_NORTHEAST_1)
.createClient(AmazonEC2Client.class, provider,
new ClientConfiguration());
// 起動許可(LaunchPermision)をコピーします。
DescribeImageAttributeResult describeImageAttributeResult = ec2ClientTokyo
.describeImageAttribute(new DescribeImageAttributeRequest(
sourceImageId, ImageAttributeName.LaunchPermission));
ModifyImageAttributeRequest modifyImageAttributeRequest = new ModifyImageAttributeRequest(
destImageId, ImageAttributeName.LaunchPermission.toString());
for (LaunchPermission permission : describeImageAttributeResult
.getImageAttribute().getLaunchPermissions()) {
modifyImageAttributeRequest
.setLaunchPermission(new LaunchPermissionModifications()
.withAdd(permission));
}
ec2ClientTokyo.modifyImageAttribute(modifyImageAttributeRequest);
}
}
Exception in thread "main" com.amazonaws.AmazonServiceException: The AMI ID 'ami-eb3802ea' is currently pending and may not be used for this operation (Service: AmazonEC2; Status Code: 400; Error Code: InvalidAMIID.Unavailable; Request ID: 236e0f90-0d2e-47e7-b2cf-5d96e1ee450a)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1071)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:719)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:454)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:294)
at com.amazonaws.services.ec2.AmazonEC2Client.invoke(AmazonEC2Client.java:9393)
at com.amazonaws.services.ec2.AmazonEC2Client.modifyImageAttribute(AmazonEC2Client.java:3929)
at aws.ec2.ami.Ec2AmiCopy.main(Ec2AmiCopy.java:98)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment