MENU

IT導入のヒントブログ IT BLOG

AWSのAmazon Lightsailでredmineを構築しました(その4[完])(スナップショット自動生成編)

hljs.initHighlightingOnLoad();

こんにちは、スミリオンの長嶋です。
 
AWSのAmazon Lightsailで、redmineを構築の続編です。
過去に掲載したブログは下記をご覧ください。
AWSのAmazon Lightsailでredmineを構築しました(その1)
https://www.smillione.co.jp/staffblog/2019/04/30/aws-amazon-lightsail-01/
AWSのAmazon Lightsailでredmineを構築しました(その2)(DNS設定編)
https://www.smillione.co.jp/staffblog/2019/09/27/aws-amazon-lightsail-02/
AWSのAmazon Lightsailでredmineを構築しました(その4)(HTTPS設定編)
https://www.smillione.co.jp/staffblog/2019/09/29/aws-amazon-lightsail-03/
 
今回の手順は、
・Amazon LightsailのスナップショットをAWS Lambda と Amazon CloudWatch を使用し自動で取得する方法
を説明したいと思います。
 
 
では、さっそく手順です。
 

Amazon LightsailのスナップショットをAWS Lambda と Amazon CloudWatch を使用し自動で取得する

①Lambdaのダッシュボードから「関数の作成」をクリックします。

 
②「一から作成」を選択します。(デフォルトで選択済み)

 
③画面下部の
「関数名」:任意の関数名
「ランタイム」:Python 3.7を選択

 
④実行ロールで、「基本的なLambdaアクセス権限で新しいロールを作成」を選択します

 
⑤「IAMコンソール」をクリックします。

 
⑥IAMで、下記のアクセス権限を付与したポリシーを作成します。
CloudWatch logs:フルアクセス
Lightsail:制限:リスト、読み取り、書き込み

 
⑦⑥で作成したポリシーを適用し、関数を作成するとCloudWatch logs、Lightsailが画面右のリソースに表示されます。
次に「トリガーを追加」をクリックします。

 
⑧「CloudWatch Events」をクリックします。

 
⑨ルールで「新規ルールの作成」をクリックし、以下を入力します。
ルール名:任意のルール名を入力します。
ルールタイプ:スケジュール式
スケジュール式:cron(0 15 * * ? *)
※ スケジュール式の設定値は任意です。上記の内容だと毎日24:15に実行

 
最後に追加をクリックします。

 
⑩作成したLambda関数「lightsail-backup」をクリックします。

 
⑪「lambda-function」のソースコードを以下に修正します。


========ここから================
# -*- coding: utf-8 -*-
import boto3
import os
import datetime
 
lightsail = boto3.client('lightsail')
 
#外部変数(環境変数)の取得
INSTANCENAME = os.environ['instancename']
MAXSNAPS = int(os.environ['maxsnaps'])
SNAPNAME = os.environ['snapname']
 
"""
自動スナップショット作成
"""
def createSnapshot():
 
    #タイムスタンプ生成
    timestamp = datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
 
    #スナップショットの作成
    newSnapName = 'autosnap-' + SNAPNAME + '-' + timestamp
    response = lightsail.create_instance_snapshot(
        instanceSnapshotName = newSnapName,
        instanceName = INSTANCENAME
    )
    print("スナップショット:「" + newSnapName + "」 を作成しました")
 
"""
最も古い自動スナップショットの削除
"""
def deleteOldestSnapshot():
    
    #全スナップショットを取得
    allSnaps = lightsail.get_instance_snapshots()
    
    #自動スナップショットのものだけにフィルタする条件定義
    isAutoInstance = ( lambda x:
        ( x['fromInstanceName'] == INSTANCENAME ) and ( x['name'][:8] == 'autosnap' )
    )
    #フィルタ
    autoSnaps = filter(isAutoInstance, allSnaps['instanceSnapshots'])
    #ソート(生成の古い順)
    autoSnaps = sorted(autoSnaps, key=lambda x:x['createdAt'])
    
    #規定のスナップショット数を超えているか確認
    if MAXSNAPS < len(autoSnaps) :
        #スナップショット削除(最も生成の古いもの)
        res = lightsail.delete_instance_snapshot(
            instanceSnapshotName = autoSnaps[0]['name']
        )
        print("スナップショット:「" + autoSnaps[0]['name'] + "」 を削除しました")
    else:
        print("削除対象のスナップショットがありませんでした")
 
"""
実行ハンドラー
"""
def lambda_handler(event, context):
    try:
        createSnapshot()
        deleteOldestSnapshot()
        return
    except Exception as e:
        print(e)
        raise e
========ここまで================

 
⑫環境変数に以下を追加し、それぞれ値を入力します。
instancename:Lightsailのインスタンス名
maxsnaps:スナップショットのバックアップを残す個数(世代)
snapname:スナップショットに付与する任意文字列

 

⑬最後に画面右上の「保存」をクリックします。
 
⑭Lightsailのスナップショット画面を確認し、スナップショットが自動生成されていれば成功です。

 

「Amazon LightsailのスナップショットをAWS Lambda と Amazon CloudWatch を使用し自動で取得する方法」の手順は以上です。
 
 
AWSのAmazon Lightsailでredmineを構築する手順を4回にわたって投稿してきましたが、このシリーズは一旦今回で完了です。
Redmineの構築、Redmineの基本的な設定、Amazon Lightsailのスナップショットの自動取得の方法などをご紹介してきましたが、この記事がどこかの誰かの参考になれば幸いです。
 

では、また
 
■参考サイト
Amazon Lightsailの自動バックアップ設定( AWS Lambda + Amazon CloudWatch を利用 )
https://blog.miminoinu.net/archives/163/