Systems Manager를 사용하여 애플리케이션 인벤토리 가져오기
클라우드에 배포된 "소프트웨어 버전"에 대해 보고할 방법이 필요합니다.
목적
각 EC2 인스턴스에서 애플리케이션 인벤토리를 가져와 중앙 집중식 계정 S3 버킷에 저장합니다. s3 버킷에서 정보를 쿼리하기 위해 Glue, Athena(다른 계정에서)를 통합하고 있습니다.
제안된 아키텍처
시행절차
각 계정에서 System Manager 인벤토리 활성화
각 계정에서 일회성 활동이므로 AWS 콘솔을 사용하여 이 기능을 활성화해야 합니다.
[ https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-inventory-configuring.html ]
접착제 세부 정보
ssm 인벤토리 출력과 일치하도록 필요한 계정에 Glue 크롤러, Glue 데이터베이스 및 테이블을 생성합니다.
아테나 쿼리
최신 보고서를 위해 크롤러 실행
예 1:
SELECT * from aws_application
예 2:
SELECT java.name, java.version, a.resourceid, accountid
FROM “ssm-inventory-crawler-db”.”aws_application” a, (select distinct (resourceid), version, name from “ssm-inventory-crawler-db”.”aws_application” where name like ‘java%’) java
where a.resourceid = java.resourceid
order by a.resourceid
예 3:
SELECT * FROM “ssm-inventory-crawler-db”.”custom_python2libraries”;
예 4:
Athena를 사용하여 "npm"과 같은 사용자 지정 인벤토리 라이브러리를 가져오려면
SELECT * FROM “ssm-inventory-crawler-db”.”custom_nodejsnpm”;
Lambda를 사용하여 자동화된 방식으로 쿼리 실행
#!/usr/bin/python3
import boto3
import datetime
import os
import json
import logging
# boto3.setup_default_session(profile_name='saml',region_name='ap-southeast-1')
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def poll_status(_id, message):
athena= boto3.client('athena',region_name='ap-southeast-1')
result = athena.get_query_execution( QueryExecutionId = _id )
state = result['QueryExecution']['Status']['State']
while state == "QUEUED":
result = athena.get_query_execution( QueryExecutionId = _id )
state = result['QueryExecution']['Status']['State']
while state == "RUNNING":
result = athena.get_query_execution( QueryExecutionId = _id )
state = result['QueryExecution']['Status']['State']
if state == "FAILED":
logger.info("FAILED-LOG: {} ".format(result))
# return result
else:
logger.info("SUCCESS-LOG : {} ".format(result))
sns_arn = os.environ["SNS_ARN"] #"arn:aws:sns:ap-southeast-1:928167378288:application-inventory-logs"
notification= _sns_notification(sns_arn,message)
return result
def run_query(query, database, s3_output):
client = boto3.client('athena',region_name='ap-southeast-1')
response = client.start_query_execution(
QueryString=query,
QueryExecutionContext={
'Database': database
},
ResultConfiguration={
'OutputLocation': s3_output,
}
)
print('Execution ID: ' + response['QueryExecutionId'])
QueryExecutionId = response['QueryExecutionId']
return QueryExecutionId
# local_filename = QueryExecutionId + '.csv'
def _sns_notification(snsarn,message):
client = boto3.client('sns')
response = client.publish(TargetArn=snsarn,Message=json.dumps({'default': json.dumps(message)}),MessageStructure='json')
logger.warning("SNS-NOTIFICATION : {} ".format(response))
return response
def lambda_handler(event, context):
#Athena configuration
s3_output = os.environ['ATHENA_OUTPUT_BUCKET'] #'s3://athena-query-result-logs/result/'
database = os.environ['GLUE_DB'] #'ssminventorycrawlerdb'
table = os.environ["GLUE_TABLE"] #'aws_application' #
app_search = os.environ["APPLICATION_LIST"] # "java% python% node%" #
app_list= app_search.split(' ')
sns_arn = "arn:aws:sns:ap-southeast-1:928167378288:application-inventory-logs" #os.environ["SNS-ARN"]
#Athena database and table definition
#Query definitions & Execute all queries
python_library = "SELECT * FROM "'"%s"'"."'"%s"'" ;" % (database, "custom_python2libraries")
npm_librarary = "SELECT * FROM "'"%s"'"."'"%s"'" ;" % (database, "custom_nodejsnpm")
all_app = "SELECT * FROM "'"%s"'"."'"%s"'" ;" % (database, table)
queries = [ python_library, npm_librarary, all_app ]
for qa in queries:
print("Executing query: %s" % (qa))
resp = run_query(qa, database, s3_output)
logger.info("QUERY-ID: {} ".format(resp))
s3_key = resp + '.csv'
message= {"Application-Inventory": s3_key,"Bucket-Details": s3_output,"App-name":qa}
logger.info("MESSAGE-DETAILS : {} ".format(message))
result = poll_status(resp, message)
for app in app_list:
specific_app = ("""SELECT java.name, java.version, a.resourceid, accountid
FROM "%s"."%s" a, (select distinct (resourceid), version, name from "%s"."%s" where name like '%s') java
where a.resourceid = java.resourceid
order by a.resourceid """) % (database, table,database, table,app)
# queries = [ python_library, npm_librarary, all_app, specific_app ]
# for q in queries:
print("Executing query: %s" % (specific_app))
res = run_query(specific_app, database, s3_output)
logger.info("QUERY-ID: {} ".format(res))
s3_key = res + '.csv'
messages= {"Application-Inventory": s3_key,"Bucket-Details": s3_output,"App-name":specific_app}
logger.info("MESSAGE-DETAILS : {} ".format(messages))
results = poll_status(res, messages)
if __name__ == '__main__':
lambda_handler("event", "context")
자원
[ https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-inventory-custom.html ]
[ https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html ]
Reference
이 문제에 관하여(Systems Manager를 사용하여 애플리케이션 인벤토리 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-builders/fetch-application-inventory-using-systems-manager-4okb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)