0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】ElastiCacheのバックアップについての備忘

Posted at

ElastiCacheのバックアップについての備忘

ElastiCacheのバックアップ方法

  • 手動バックアップ
    以下を設定できる
    • ソースにするノード
    • バックアップの名前
    • 暗号化キー
    • タグ
  • 自動バックアップ
    クラスターの設定で有効化する
    以下を設定できる
    • ソースにするノード
    • バックアップの保持期間
    • バックアップの開始時刻
    • バックアップが開始される時間の幅

イベントについて

また、バックアップに起因した処理を行うためにCloudTrailのイベント履歴を確認したのだが、両者には以下の違いがあった
手動バックアップ
イベント名「CreateSnapshot」がCloudTrailに履歴として表示される
自動バックアップ
イベントがCloudTrailに履歴として表示されることはない

python boto3について

python boto3でスナップショットの情報を取得すると以下のようになる
(スナップショットを作成日でソートしたかったため調査、レスポンスとして「CacheClusterCreateTime」が得られるため可能だった)

リクエスト構文

response = client.describe_snapshots(
    ReplicationGroupId='string',
    CacheClusterId='string',
    SnapshotName='string',
    SnapshotSource='string',
    Marker='string',
    MaxRecords=123,
    ShowNodeGroupConfig=True|False
)

レスポンス構文

{
    'Marker': 'string',
    'Snapshots': [
        {
            'SnapshotName': 'string',
            'ReplicationGroupId': 'string',
            'ReplicationGroupDescription': 'string',
            'CacheClusterId': 'string',
            'SnapshotStatus': 'string',
            'SnapshotSource': 'string',
            'CacheNodeType': 'string',
            'Engine': 'string',
            'EngineVersion': 'string',
            'NumCacheNodes': 123,
            'PreferredAvailabilityZone': 'string',
            'PreferredOutpostArn': 'string',
            'CacheClusterCreateTime': datetime(2015, 1, 1),
            'PreferredMaintenanceWindow': 'string',
            'TopicArn': 'string',
            'Port': 123,
            'CacheParameterGroupName': 'string',
            'CacheSubnetGroupName': 'string',
            'VpcId': 'string',
            'AutoMinorVersionUpgrade': True|False,
            'SnapshotRetentionLimit': 123,
            'SnapshotWindow': 'string',
            'NumNodeGroups': 123,
            'AutomaticFailover': 'enabled'|'disabled'|'enabling'|'disabling',
            'NodeSnapshots': [
                {
                    'CacheClusterId': 'string',
                    'NodeGroupId': 'string',
                    'CacheNodeId': 'string',
                    'NodeGroupConfiguration': {
                        'NodeGroupId': 'string',
                        'Slots': 'string',
                        'ReplicaCount': 123,
                        'PrimaryAvailabilityZone': 'string',
                        'ReplicaAvailabilityZones': [
                            'string',
                        ],
                        'PrimaryOutpostArn': 'string',
                        'ReplicaOutpostArns': [
                            'string',
                        ]
                    },
                    'CacheSize': 'string',
                    'CacheNodeCreateTime': datetime(2015, 1, 1),
                    'SnapshotCreateTime': datetime(2015, 1, 1)
                },
            ],
            'KmsKeyId': 'string',
            'ARN': 'string',
            'DataTiering': 'enabled'|'disabled'
        },
    ]
}

※AWS Boto3 1.34.9 documentationから引用
AWS Boto3 1.34.9 documentation

補足

ElastiCacheダッシュボードの「バックアップ」に格納されたスナップショットのうち、作成日が最新で、当日であるもののコピーをS3に格納するLambda

import boto3
import datetime
import os
import re
import random
 
client = boto3.client('elasticache')
 
def lambda_handler(event, context):
    DIFF_JST_FROM_UTC = 9
    todays = datetime.datetime.today().date()
    source_name = None
 
    try:
        response = client.describe_snapshots(
            ShowNodeGroupConfig=True
        )
 
    except Exception as e:
        error_message = f"エラーが発生しました: {str(e)}"
        print(error_message)
        raise Exception(error_message)
 
    if 'Snapshots' in response and response['Snapshots']:
        snapshots = sorted(response['Snapshots'], key=lambda x: x['CacheClusterCreateTime'])
        latest = snapshots[-1]
 
        if latest['SnapshotStatus'] == 'available':        
            snapshot_date = latest['CacheClusterCreateTime'].date()
            if snapshot_date == todays:
                source_name = latest['SnapshotName']
 
        try:
            if source_name is not None: 
                response = client.copy_snapshot(
                    SourceSnapshotName=source_name, 
                    TargetSnapshotName=source_name + str(random.randint(100000,999999)),
                    TargetBucket=os.getenv("TARGETBUCKET")
                )
                print('スナップショット:'+source_name+'をS3にコピーしました')
 
        except Exception as e:
            print(source_name)
            print("2")
            error_message = f"エラーが発生しました: {str(e)}"
            print(error_message)
            raise Exception(error_message)
 
    else:
        error_message = 'source_nameが見つかりません'
        raise Exception(error_message)

環境変数
キー:TARGETBUCKET
値:任意の格納先S3バケット名

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?