AWS UD Cloudパッケージ

世代管理ツールをAWS CLIで実装

お問い合わせ

Nameタグを自動でつけるLambda関数を実装

2019年12月16日

世代管理ツールをAWS CLIで実装

前回、AWS Systems Managerのメンテナンスウィンドウという機能を利用して、AMIバックアップのタスクを設定したエピソードをご紹介しました。
フロントサーバーに関しては月次で、データベースサーバーに関しては日次で自動バックアップが取得できる環境ができました。

再構築プロジェクトのチームでは、設定したタスクをまずは1週間動かして様子をみてみることにしました。1週間後、AMIバックアップとスナップショットの取得は問題なく実施されていたのですが、作成されたAMIにはネームタグが設定されないことに気づきました。

Nameタグが設定されていても、されていなくてもバックアップは成功しているので問題はなかったのですが、世代管理ツールの識別子でNameタグを利用する予定だったので、自動で名前をつけるLambda関数を自作することにしました。

朝6時台に取得したAMIバックアップにNameタグを設定する

前回、ご紹介し切れなかったDaily_processing_2は、Systems Managerによって取得されたフロントサーバーとデータベースサーバーのAMIにNameタグをつけるLambda関数「Naming_the_AMI」を設定しています。

Naming_the_AMIのコードは以下の通りです。

import json
import boto3
import os

def lambda_handler(event, context):
    # 辞書型でインスタンス ID と Name タグを指定
    set_Name = {'インスタンスID':'Nameタグに設定したい名前':'インスタンスID': 'Nameタグに設定したい名前'}

    # ec2_client に EC2 クライアントを取得
    ec2_client = boto3.client('ec2',region_name = os.environ['REGION_NAME'])
    #ec2_resource = boto3.resource('ec2',region_name = os.environ['REGION_NAME'])
    # response にAMIを取得(フィルタリングして対象を減らす)
    response = ec2_client.describe_images(
        Filters = [
            {
                'Name': 'root-device-type',
                'Values': [
                    'ebs',
                ]
            },
            {
                'Name': 'platform',
                'Values': [
                    'windows',
                ]
            },
        ],
        Owners=[
            'アカウントID',
        ],
    )

    for image in response["Images"]:
        # Name タグを設定するかどうかを決めるフラグ True: Name タグを設定する / False: スキップする
        gofrg = True
        try:
            for tag in image["Tags"]:
                # Name タグが設定されている場合は何もしない
                if (tag["Key"] == 'Name' ):
                    print(tag["Value"])
                    gofrg = False
        # タグが何も設定されていない場合はこちら
        except Exception as error_exceptiopn:
            print(image["Name"][:19])   # エラーになるのでダミー出力
        
        if gofrg:
            print('Name タグを設定する: ' + str(image["ImageId"]) + '-> ' + str(image["Name"][:19]))
            if str(image["Name"][:19]) in set_Name:
                val = set_Name[str(image["Name"][:19])]
                # Name タグ設定
                ec2_client.create_tags(
                    Resources=[
                        image["ImageId"],
                    ],
                    Tags=[
                    {
                        'Key': 'Name',
                        'Value': val
                    },
                    ]
                )
                
            else:
                print('-> 命名規則に沿っていないためスキップ')

AMIをresponse変数に取り込み

まず、responseという変数にAMIの一覧を取り込みます。この際、フィルタリングせずに取り込むと、すべてのAMIを取ってきてしまうので、リージョン、所有者、Windows Server、EBSボリュームの4点で対象を絞りました。
リージョンは環境変数を使用しました。

AMI一覧をfor文でひとつずつ評価

responseに取得したAMIをfor文でひとつずつ評価し、まずNameタグが指定されている場合は何もせずスキップ。Nameタグが指定されていない場合は、名前をつけるロジックにしました。
以下の図のとおり、AMI名はインスタンスIDで始まります。

そのため、19文字までがインスタンスIDと一致したら名前を付けることにしました。つまり左から19文字目までがi-55556666777788889 だったらフロントサーバーと名付け、左から19文字目までがi-00001111222233334だったらデータベースサーバーと名付けることにしました。

Nameタグの設定をすることで視覚的にも見やすくなりましたし、世代管理ツールの識別子としての役割も与えることができました。

次回は、世代管理ツールについてご紹介させていただきます。

ページ上部へ戻る

カテゴリー

タグ