一度書いたスクリプトはいじりたくない
AWS EC2のステータス監視をLambdaで行う際、スクリプトに直接インスタンスIDを記載して
実行するのも一つの手段ですが、監視対象サーバーが増えたり減ったりした場合や、動作確認のため対象サーバーをいちいち書き換えて実行するのも意外とめんどい。
あと、外部モジュールを使った際、ZIPでアップロードが必要な為、いちいちやってられんのじゃー!
その為
インスタンスにタグを振り、タグが付いているサーバーを監視対象とすることでスクリプトを変えず対応可能となります。
EC2タグサンプル
「KanshiFlag」という名のタグを作成し、監視対象サーバーの値に「1」を振ります。
取得条件
「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」以外を設定する)
これでスクリプトをいじらずに変更可能となります。