1

Java API for AWS をしばらく使用していますが、どういうわけか、CreateImage リクエストで作成されたスナップショットを削除する方法が見つかりません。

このリクエストは、イメージ ID を含むイメージを提供します。画像を削除したい場合は、この ID を指定して登録を解除できます。しかし、そのイメージで使用されているスナップショットを削除する方法が見つかりません。

ここで何か不足していますか?

前もって感謝します、

ギリエル

PS: 私が何を意味するかを示すいくつかのコード:

final CreateImageResult createAMIResult =  AWS.ec2.createImage(new CreateImageRequest().withInstanceId(instanceID).withName(amiName).withNoReboot(noReboot));
final String imageId = createAMIResult.getImageId();

//After a while I want to remove it again

AWS.ec2.deregisterImage(new DeregisterImageRequest(imageId));
//TODO: How to remove the snapshot??
4

1 に答える 1

2

AWS 開発者フォーラムを検索した後、解決策が非常に残念であることがわかりました。

すべてのスナップショットの説明を確認し、イメージ ID に一致するものを削除する必要があります。

CreateImage を使用する場合、説明は次の形式になります。 Created by CreateImage(i-xxxxxxxx) for ami-xxxxxxxx from vol-xxxxxxxx

したがって、ami-xxxxxxx の部分を自分のイメージ ID と照合するだけです。

編集

AWS が提供するコピー機能を使用する場合、このソリューションは機能しません。私の新しいソリューションは、EBS ボリュームがブロック デバイスとして ami に追加され、スナップショット ID にアクセスできるという事実に基づいています! 例としていくつかのコード:

/**
 * Removes an ami and its snapshot.
 * @param amiID
 * @param snapshotID
 */
public static void removeImage(final String amiID, final AmazonEC2 ec2) {
    if (amiID != null) {
        DescribeImagesResult result = ec2.describeImages(new DescribeImagesRequest().withImageIds(amiID).withOwners(owner));
        if (!result.getImages().isEmpty()) {
            ec2.deregisterImage(new DeregisterImageRequest(amiID));
            for (BlockDeviceMapping blockingDevice : result.getImages().get(0).getBlockDeviceMappings()) {
                if (blockingDevice.getEbs() != null) {
                    ec2.deleteSnapshot(new DeleteSnapshotRequest().withSnapshotId(blockingDevice.getEbs().getSnapshotId()));
                }
            }
        }
    }
}
于 2013-03-13T12:16:33.467 に答える