CloudWatch Events -EC2 Create Snapshot API 呼び出し①-

こんにちは。katoです。

CloudWatch Eventsの組み込みターゲットである「EC2 Create Snapshot API 呼び出し」を利用して、スナップショットの自動取得を行いたいと思います。

初回となる今回は、AWSコンソール上からの設定方法やlambda functionとの違いなどをご説明していきます。

 

なぜCloudWatch Events?

EBSスナップショットの自動取得を行おうと思ったら、lambdaを採用する場合が多いかと思います。実際に弊社でもlambdaを利用しスナップショットを取得・管理しております。

では、なぜcloudwatch eventsでスナップショットを取る必要があるのか?

大きな理由として挙げられるのが、lambdaの実行時間制限によるものです。

lambdaでスナップショットの取得や管理を行っていると、対象が増えるにつれて実行時間が長くなってしまいます。通常は対象が増えたからと言ってlambdaの実行時間制限である300秒を超えてしまうといったようなことはあまりないと思いますが、処理の追加を検討している場合などはこの問題がどうしてもネックになると思います。sleepを入れたい場合などはなおさらですね。

そこで、スナップショットの取得に関してはcloudwatch eventsで実行させて、lambda側の処理の負担を減らすということが可能になります。

単純にスナップショットを取得したい、というだけであればスクリプトなどを書く必要なく、スナップショットを取得することが可能なので、lambdaよりもcloudwatch eventsの方が簡単に扱えるかと思います。

 

設定方法

それでは、実際にcloudwatch eventsを利用して、スナップショットを取得していきます。

まず、AWSコンソールからcloudwatchサービスを開き、イベントルールの作成を行います。
ターゲットにて「EC2 Create Snapshot API 呼び出し」を選択し、スナップショット取得対象のEBSボリュームIDを指定します。

 

「設定の詳細」をクリックし、ルールの設定を行っていきます。ここで重要になるのがルールに付与するIAMロールの選択です。

lambdaの場合、lambdaに付与されているロールの権限でイベントが実行されますが、組み込みターゲットを使用する場合、イベントを実行するための下記のような権限を持ったIAMロールが必要になります。

(下記ポリシーはスナップショット取得以外の権限も含めれていますので、不要な場合は適宜修正してください)

 

IAMポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "ec2:RebootInstances",
                "ec2:StopInstances",
                "ec2:TerminateInstances",
                "ec2:CreateSnapshot"
            ],
            "Resource": "*"
        }
    ]
}

 

信頼関係
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "automation.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

 

「新しいロールの作成」の「基本イベント実行ロール」から進めることで、上記の権限を持ったロールを新規に作成することが可能です。

以上でスナップショットを取得するための準備は完了です。
あとは設定したイベントの実行タイミングになったら自動でスナップショットが取得されていきます。

 

CloudWatch Eventsの欠点

ここまでご説明したように、cloudwatch eventsを利用することで簡単にスナップショットの自動取得を実現することが可能となります。

では、なぜわざわざlambdaで面倒なスクリプトを書いてスナップショットを取得する必要があるのか?
それは、cloudwatch eventsはスナップショットを取得すること以上はできないためです。

スナップショットの自動取得を導入する場合、保存する世代数や保存期間などを考慮すると思いますが、clouodwatch eventsだけでは、スナップショットの削除などの管理を行うことが出来ません。

そのため、細かい設定やスナップショットの管理も同時に行えるlambdaが利用されるケースが多くなっているのだと思います。

他にも、下記のようなデメリットが存在します。
・タグやdescriptionの設定が不可
・ルールあたり5個のターゲットまで(1つのルールで5個ボリューム指定まで)
・エラー時の詳細なログ出力なし

 

それでもCloudWatch Eventsが良い!

cloudwatch eventsではスナップショットを取ることしかできません。
それで十分です。管理はlambdaにやってもらいましょう。

ということで、次回からlambdaと連携して管理&自動化を行っていきます。

 

 

 

アプリケーション開発バナー