信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

2018

21

6月

コスト配分タグを自動でチェックしたい!

テクログ

恒例のしたいシリーズです。

いまつくりました。


●なにがしたいの?


AWSアカウント内に複数の媒体があって、

どの媒体にどれだけお金がかかっているかをチェックするために、

リソースにProjectタグをつけると簡単に集計できます。

でも、リソースは随時増えるし、ちゃんとProjectタグついているのかわからない。

なんとかしたいという気持ち。


●どうやるの?


LambdaでリソースにProjectタグがついているかをチェック。

+Projectタグの値もチェック(ちがうのがついてたらこまるからね)

チェックしない、というのも設定したい。

あと、結果はSlackに通知したりしたい。


●具体的には?


ソースをはりますんで見てね!


EC2のタグチェックの例です。

サンプルですよ。


・追加ライブラリ

slackweb

いれてください。


・使っている環境変数

ACCOUNT_NAME AWSアカウントの名前とかをいれます。通知用です。

CHECK_TAG_NAME チェックしたいタグをいれます。今回はProjectです。

CHECK_TAG_VALUES カンマ区切りで、入っていていほしいタグの値をいれます。aaa.jp,bbb.jp みたいなのです

SLACK_URL SlackのWebhookURLです。


・ソース


(Pythonらしさはかけらもありませんがゆるしてください


# -*- coding: utf-8 -*-
# EC2のタグ設定チェック

import boto3
import os
import slackweb
import sys

# アカウント名
ACCOUNT_NAME   = os.environ['ACCOUNT_NAME']
# チェックするタグ名
CHECK_TAG_NAME  = os.environ['CHECK_TAG_NAME']
# ついていてほしいタグの内容(どれかならOK)
CHECK_TAG_VALUES = os.environ['CHECK_TAG_VALUES'].split(",")
#slackurl
SLACK_URL    = os.environ['SLACK_URL']

REGION_NAME = 'ap-northeast-1'

#####################################################
#本体
#####################################################
def lambda_handler(event, context):
  #タグチェック
  results = checkTags()
  print('checkTags results:')
  print(results)

  checkResult_AND_Notify(results)

#####################################################
# インスタンスID一覧を取得
#####################################################
def checkTags():
  instance_list = []

  #ページャーで全て取得
  client  = boto3.client('ec2', region_name=REGION_NAME)
  paginator = client.get_paginator('describe_instances')

  # Filterで止まっているものは除外
  page_iterator = paginator.paginate(
    Filters=[
    {
      'Name': 'instance-state-name',
      'Values': [
        'running',
      ]
    }
  ],)

  #チェックしていく
  for page in page_iterator:
    for reservation in page["Reservations"]:
      for instance in reservation["Instances"]:
        instance_id = instance["InstanceId"]

        #Tagsを見て、CheckProjectSettingがNOならば除外(存在しない、またはYESなら追加
        check_flag       = True
        project_tag_exist_flag = False
        project_tag_value   = ""
        name_tag_value     = ""
        Tags = instance["Tags"]

        for tag in Tags:
          if tag['Key'] == 'CheckProjectSetting':
            if tag['Value'] == 'NO':
              print('CheckProjectSetting,NO:' + instance_id)
              check_flag = False

          if tag['Key'] == 'Project':
            project_tag_exist_flag = True
            project_tag_value = tag['Value']
            print('Project tag_value:' + project_tag_value)

          #Nameはわかりやすさのため取ります
          if tag['Key'] == 'Name':
            name_tag_value = tag['Value']
            print('Project tag_value:' + name_tag_value)

        if check_flag == True:
          print('CheckProjectSetting,YES:' + instance_id)

          if project_tag_exist_flag == False:
            #タグ自体がない場合は即追加
            instance_id_dict = {
              "instance_id"    : instance_id,
              "name_tag_value"  : name_tag_value,
              "project_tag_value" : project_tag_value,
              "reason"      : "no_project_tag"
            }
            instance_list.append(instance_id_dict)
          else:
            #タグはあった場合、中身を確認し、なかったら一覧追加
            if project_tag_value not in CHECK_TAG_VALUES:
              instance_id_dict = {
                "instance_id"    : instance_id,
                "name_tag_value"  : name_tag_value,
                "project_tag_value" : project_tag_value,
                "reason"      : "project_tag_not_match"
              }
              instance_list.append(instance_id_dict)

  return instance_list

#####################################################
# 漏れがあるものを通知
#####################################################
def checkResult_AND_Notify(results):
  print('checkResult_AND_Notify')

  exist_no_Tag_Flag = False
  res_str = ''

  for result in results:
    exist_no_Tag_Flag = True
    res_str += '>  Name:' + result['name_tag_value'] + ' ID:' + result['instance_id'] + ' 理由:' + result['reason'] +'\n'

  if exist_no_Tag_Flag:
    title_str = "ProjectタグをつけてないEC2インスタンスがあったよ!付けてね!\n"
    slack = slackweb.Slack(url=SLACK_URL)
    slack.notify(text=ACCOUNT_NAME + "のProjectタグチェックをしたよ!\n\n" + title_str + res_str)
  else:
    print("ProjectタグをつけてないEC2インスタンスはなかったよ!")


※Tagsを見て、CheckProjectSettingがNOならば除外


やったね!もうタグがあるかどうかをチェックしなくていいよ!


肝心のタグ設定は場合によりますので、手動で付けてくださいね。


以上!



(見栄え用の画像↓)

この記事を書いた人

マスオさん

tzwy

所 属:
WEBインテグレーション事業部
出身地:
saitama
仕事内容:
いろいろ検証、作成、障害対応とか品質向上とか