Closed12

CloudFormationをDR環境構築に利用する方法を考えてみる

chittaichittai

やりたいこと

  • 毎日メインサイトでEC2/RDSのバックアップを取得。(AWS Backupを利用?)
  • 取得したバックアップをDRリージョンに転送する
  • そのDRサイトに送られたバックアップの中で、最新のバックアップを利用してCloudFormationでリストアする

考慮点

  • バックアップが取得されるとAMIIDなどは変わる。常に最新の情報を選択するにはどうしたらいいのか
  • メインサイトと同じテンプレートを利用する場合、環境毎の変数はどの様に管理するか
  • CloudFromationで構築するとなると、AWS Backupで取得したバックアップをAWS Backup以外で利用することになる
chittaichittai

とりあえず、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
chittaichittai

どのタイミングでどう更新するのか検討が必要。EventBridgeでBackupのイベントと紐付けようとしたけど、DR側(コピー先)ではジョブがないので何をトリガーにするのかは検討が必要

chittaichittai

とりあえず、ParameterStoreからの参照方法

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html

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指定でできないか確認する→出来なさそう

chittaichittai

メモ:どうやってキックするのか、どうやって更新するのかを検討する

chittaichittai

まずは、パラメータストアの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>"]
    }
  }
}
chittaichittai

Lambdaでeventから↓でami-idを取り出せる

ami_id = event['detail']['responseElements']['imageId']
chittaichittai

あとでもう少し直す

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
    )

chittaichittai

やはり、イベントパターンにはワイルドカードは使用できない。。DR側に転送した時は何のパラメータで対象を限定するか...

{
  "source": ["aws.ec2"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["ec2.amazonaws.com"],
    "eventName": ["CopyImage"],
    "requestParameters": {
      "name": ["AwsBackup_i-*"]
    }
  }
}

CopyImageのイベントを全受けして、その中のパラメータでなんとかする方式をためす。パラメータストアのパラメータ名をインスタンスIDでコントロールする

このスクラップは2021/03/30にクローズされました