LoginSignup
0
3

More than 5 years have passed since last update.

監視対象のサーバーにはタグを振ろう

Last updated at Posted at 2017-11-30

一度書いたスクリプトはいじりたくない

AWS EC2のステータス監視をLambdaで行う際、スクリプトに直接インスタンスIDを記載して
実行するのも一つの手段ですが、監視対象サーバーが増えたり減ったりした場合や、動作確認のため対象サーバーをいちいち書き換えて実行するのも意外とめんどい。

あと、外部モジュールを使った際、ZIPでアップロードが必要な為、いちいちやってられんのじゃー!

その為

インスタンスにタグを振り、タグが付いているサーバーを監視対象とすることでスクリプトを変えず対応可能となります。

EC2タグサンプル

「KanshiFlag」という名のタグを作成し、監視対象サーバーの値に「1」を振ります。

EC2.jpg

取得条件

「KanshiFlag」が「1」で起動中(インスタンスの状態が「runninng」)のサーバーの
インスタンスIdとサーバー名を取得する。(赤丸がついているサーバー)

サンプルスクリプト


import boto3

ec2c = boto3.client('ec2')

##############################################
#フィルターから起動しているインスタンスID取得
#引数:タグ名 KanshiFlag 値:1
#戻り値:インスタンスIDのList
##############################################
def func_GetInstanceId(FilterName,FilterValue):

    instanceid_List = []
    retec2c = ec2c.describe_instances(
        Filters=[
        {'Name': FilterName, 'Values': [FilterValue]}
        ,{'Name':'instance-state-name','Values': ['running']}
        ]
    )
    for reservation in retec2c['Reservations']:
      for instanceid in reservation['Instances']:
        instanceid_List.append(instanceid['InstanceId'])

    return instanceid_List
##############################################
#インスタンスIDからタグ名取得
#引数:インスタンスID i-123456789abcdefg
#戻り値:タグ名 Win2016_SV2
##############################################
def func_RET_ServerTagName(SET_InstanceId):

    TagName = ec2c.describe_tags(
        Filters=[
        {'Name': 'resource-id', 'Values': [SET_InstanceId]}
        ,{'Name': 'tag-key', 'Values': ['Name']}
        ])
    try:
        RET_ServerTagName=TagName['Tags'][0]['Value']
    except Exception as e:
        RET_ServerTagName="サーバー名未設定"
    return RET_ServerTagName

################################
# MAIN
################################
def lambda_handler(event, context):
#if __name__ == "__main__":

    #タグ名 KanshiFlag 値:1のインスタンスIDを取得(List)
    insid_list = func_GetInstanceId('tag:KanshiFlag','1')

    for insid in insid_list:
        #インスタンスIDからTag名(サーバー名)を取得
        ins_name=func_RET_ServerTagName(insid)
        print(ins_name + "(" + insid + ")")

補足

以前記載したスクリプトと同じような内容ですが

def func_GetInstanceId(FilterName,FilterValue):

にタグ名と値の引数を追加。

又、describe_instancesに引数の「タグ名」「値」、又、「起動中サーバー」を取得するようにフィルターを追加

    retec2c = ec2c.describe_instances(
        Filters=[
        {'Name': FilterName, 'Values': [FilterValue]}
        ,{'Name':'instance-state-name','Values': ['running']}
        ]
    )

取得する際には

FilterName  'tag:KanshiFlag'
FilterValue  '1'

を引数にし取得。

insid_list = func_GetInstanceId('tag:KanshiFlag','1')

結果

「KanshiFlag」が「1」で起動中のサーバー名、インスタンスIDが取得できたことを確認。
(インスタンスIDは適当に書き換えています。)

WindowsSV(i-0123456789abcdefg)
Zabbix(i-5656565656)
Win2017SV(i-000111222333444555)
Win2012(i-7777777777777777)

監視対象を変えるには

追加する場合・・・「KanshiFlag」タグの値に「1」を設定する。
削除する場合・・・「KanshiFlag」タグの値を削除する(又は値を「1」以外を設定する)

これでスクリプトをいじらずに変更可能となります。

0
3
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
3