CloudFormationをDR環境構築に利用する方法を考えてみる
やりたいこと
- 毎日メインサイトでEC2/RDSのバックアップを取得。(AWS Backupを利用?)
- 取得したバックアップをDRリージョンに転送する
- そのDRサイトに送られたバックアップの中で、最新のバックアップを利用してCloudFormationでリストアする
考慮点
- バックアップが取得されるとAMIIDなどは変わる。常に最新の情報を選択するにはどうしたらいいのか
- メインサイトと同じテンプレートを利用する場合、環境毎の変数はどの様に管理するか
- CloudFromationで構築するとなると、AWS Backupで取得したバックアップをAWS Backup以外で利用することになる
とりあえず、DR側で利用するためのEC2構築要テンプレートを用意する。このImageIdの参照をどう変更していくかがポイント。メインとDRでIDが変わるだろうから、どうするか。
AWSTemplateFormatVersion: 2010-09-09
Description: Launch a simple EC2 instance
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-xxxxxx
InstanceType: t2.small
ParameterStoreでAMI IDを外だしして、そこを更新する方向で調べてみる
どのタイミングでどう更新するのか検討が必要。EventBridgeでBackupのイベントと紐付けようとしたけど、DR側(コピー先)ではジョブがないので何をトリガーにするのかは検討が必要
とりあえず、ParameterStoreからの参照方法
AWSTemplateFormatVersion: 2010-09-09
Description: A simple EC2 instance
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: "{{resolve:ssm:ami-id-latest:1}}"
InstanceType: t2.small
これだと、パラメータのversion を指定する必要があるが、最新のパラメータの指定というのはできないらしい。なので、やり方を変更する必要がありそう。パラメータを削除して、同じ名前で作り直すのが良さそう??
tag指定でできないか確認する→出来なさそう
メモ:どうやってキックするのか、どうやって更新するのかを検討する
まずは、パラメータストアのAMI IDの書き換えから検討してみる。一旦、CloudTrailのCreateImageが実行を契機にLambdaからパラメータを書き換える方針で試す
EventBridgeのイベントパターンを下記で作成。これで、<InstaceId>からAMIが作成されたイベントを受けるようにする
{
"source": ["aws.ec2"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["ec2.amazonaws.com"],
"eventName": ["CreateImage"],
"requestParameters": {
"instanceId": ["<InstanceId>"]
}
}
}
次は、処理をLamdaで書く
put-parameterでパラメータ作成しようとしたら、ドキュメントでは必須になっていないが、 --typeオプションが必須だった
Lambdaでeventから↓でami-idを取り出せる
ami_id = event['detail']['responseElements']['imageId']
あとでもう少し直す
from __future__ import print_function
import json
import boto3
# Region
REGION = 'ap-northeast-1'
def lambda_handler(event, context):
client = boto3.client('ssm', region_name=REGION)
response_delete = client.delete_parameter(
Name = 'ami-id-latest'
)
response_put = client.put_parameter(
Name = 'ami-id-latest',
Value = event['detail']['responseElements']['imageId'],
Type = 'String',
Overwrite = True
)
やはり、イベントパターンにはワイルドカードは使用できない。。DR側に転送した時は何のパラメータで対象を限定するか...
{
"source": ["aws.ec2"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["ec2.amazonaws.com"],
"eventName": ["CopyImage"],
"requestParameters": {
"name": ["AwsBackup_i-*"]
}
}
}
CopyImageのイベントを全受けして、その中のパラメータでなんとかする方式をためす。パラメータストアのパラメータ名をインスタンスIDでコントロールする