📝

AMIの作成に時間がかかる場合の対応

2021/05/24に公開

EC2インスタンスからAMIを取得する際、時間がかかる場合があります。

ボリュームのサイズによっては、AMI 作成プロセスの完了に数分かかる場合があります (最長で 24 時間かかることもあります)。
カスタム Windows AMI を作成する - Amazon Elastic Compute Cloud

対応

時間を短縮したい場合、AMIを取得する前にボリュームのスナップショットを作成するという対応が可能です。

AMI を作成する前に、ボリュームのスナップショットを作成しておくと、効率が向上する可能性があります。この方法では、AMI を作成する際に作成する必要があるのは小さい差分スナップショットのみになるため、プロセスがよりすばやく完了します (スナップショット作成の合計時間は同じです)。

AMIに含まれるスナップショットは、増分バックアップのため、直前のスナップショットからの差分が少なければ、AMI作成時のスナップショットの作成も速くなる可能性があります。

スナップショットは増分バックアップです。つまり、最後にスナップショットを作成した時点から、ボリューム上で変更のあるブロックだけが保存されます。これにより、スナップショットを作成するのに要する時間が最小限に抑えられ、データを複製しないことで、ストレージコストが節約されます。各スナップショットには、(スナップショットを作成した瞬間から) データを新しい EBS ボリュームに復元するために必要な情報がすべて含まれます。
Amazon EBS スナップショット - Amazon Elastic Compute Cloud

自動化例

AMI取得のたびにスナップショットを手動で作るのは手間なので、1つ自動化の例をご紹介します。

デプロイ時に一時スナップショット作成

EC2インスタンスにデプロイが完了したら、一時スナップショットを作成し、AMI作成後に一時スナップショットを削除しておくという例です。

  • 開発者がCodeDeployでデプロイ
  • CodeDeployの通知機能でSNSトピックを指定
  • SNSのエンドポイントにLambda関数を指定
  • Lambdaからデプロイの完了したEC2インスタンスのEBSにスナップショットの作成リクエスト

スナップショット作成にはCreateSnapshot APIを使用します。

サンプルコード

Class: AWS.EC2 — AWS SDK for JavaScriptより

/* This example creates a snapshot of the volume with a volume ID of ``vol-1234567890abcdef0`` and a short description to identify the snapshot. */

 var params = {
  Description: "This is my root volume snapshot.", 
  VolumeId: "vol-1234567890abcdef0"
 };
 ec2.createSnapshot(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
   /*
   data = {
    Description: "This is my root volume snapshot.", 
    OwnerId: "012345678910", 
    SnapshotId: "snap-066877671789bd71b", 
    StartTime: <Date Representation>, 
    State: "pending", 
    Tags: [
    ], 
    VolumeId: "vol-1234567890abcdef0", 
    VolumeSize: 8
   }
   */
 });

まとめ

今回はAMIの作成に時間がかかる場合の対応を紹介しました。
先にスナップショットを作成しておけば短縮できそうですが、スナップショットを消し忘れると余計な課金が発生するので、できれば自動削除までしておきたいとことです。
API自体はシンプルな記述で実装できるので、機会があれば試してみてください。
参考になれば幸いです。

Discussion