in static/watool/200_Using_AWSCLI_To_Manage_WA_Reviews/Code/LabExample.py [0:0]
def main():
boto3_min_version = "1.16.38"
# Verify if the version of Boto3 we are running has the wellarchitected APIs included
if (packaging.version.parse(boto3.__version__) < packaging.version.parse(boto3_min_version)):
logger.error("Your Boto3 version (%s) is less than %s. You must ugprade to run this script (pip3 upgrade boto3)" % (boto3.__version__, boto3_min_version))
exit()
# STEP 1 - Configure environment
logger.info("1 - Starting Boto %s Session" % boto3.__version__)
# Create a new boto3 session
SESSION = boto3.session.Session()
# Initiate the well-architected session using the region defined above
WACLIENT = SESSION.client(
service_name='wellarchitected',
region_name=REGION_NAME,
)
WORKLOADNAME = 'WA Lab Test Workload'
DESCRIPTION = 'Test Workload for WA Lab'
REVIEWOWNER = 'WA Python Script'
ENVIRONMENT= 'PRODUCTION'
AWSREGIONS = [REGION_NAME]
LENSES = ['wellarchitected', 'serverless']
# STEP 2 - Creating a workload
# https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/2_create_workload/
logger.info("2 - Creating a new workload")
CreateNewWorkload(WACLIENT,WORKLOADNAME,DESCRIPTION,REVIEWOWNER,ENVIRONMENT,AWSREGIONS,LENSES)
logger.info("2 - Finding your WorkloadId")
workloadId = FindWorkload(WACLIENT,WORKLOADNAME)
logger.info("New workload created with id %s" % workloadId)
logger.info("2 - Using WorkloadId to remove and add lenses")
listOfLenses = listLens(WACLIENT)
logger.info("Lenses currently available: %s" % listOfLenses)
workloadJson = GetWorkload(WACLIENT,workloadId)
logger.info("Workload ID '%s' has lenses '%s'" % (workloadId, workloadJson['Lenses']))
logger.info("Removing the serverless lens")
disassociateLens(WACLIENT,workloadId,['serverless'])
workloadJson = GetWorkload(WACLIENT,workloadId)
logger.info("Now workload ID '%s' has lenses '%s'" % (workloadId, workloadJson['Lenses']))
logger.info("Adding serverless lens back into the workload")
associateLens(WACLIENT,workloadId,['serverless'])
workloadJson = GetWorkload(WACLIENT,workloadId)
logger.info("Now workload ID '%s' has lenses '%s'" % (workloadId, workloadJson['Lenses']))
# STEP 3 - Performing a review
# https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/3_perform_review/
logger.info("3 - Performing a review")
logger.info("3 - STEP1 - Find the QuestionId and ChoiceID for a particular pillar question and best practice")
questionSearch = "How do you reduce defects, ease remediation, and improve flow into production"
questionId = findQuestionId(WACLIENT,workloadId,'wellarchitected','operationalExcellence',questionSearch)
logger.info("Found QuestionID of '%s' for the question text of '%s'" % (questionId, questionSearch))
choiceSet = []
choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Use version control"))
logger.info("Found choiceId of '%s' for the choice text of 'Use version control'" % choiceSet)
choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Use configuration management systems"))
choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Use build and deployment management systems"))
choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Perform patch management"))
choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Use multiple environments"))
logger.info("All choices we will select for questionId of %s is %s" % (questionId, choiceSet))
logger.info("3 - STEP2 - Use the QuestionID and ChoiceID to update the answer in well-architected review")
answers = getAnswersForQuestion(WACLIENT,workloadId,'wellarchitected',questionId)
logger.info("Current answer for questionId '%s' is '%s'" % (questionId, answers))
logger.info("Adding answers found in choices above (%s)" % choiceSet)
updateAnswersForQuestion(WACLIENT,workloadId,'wellarchitected',questionId,choiceSet,'Added by Python')
answers = getAnswersForQuestion(WACLIENT,workloadId,'wellarchitected',questionId)
logger.info("Now the answer for questionId '%s' is '%s'" % (questionId, answers))
# STEP 4 - Saving a milestone
# https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/4_save_milestone/
logger.info("4 - Saving a Milestone")
logger.info("4 - STEP1 - Create a Milestone")
milestones = listMilestones(WACLIENT,workloadId)
milestoneCount = jmespath.search("length([*].MilestoneNumber)",milestones)
logger.info("Workload %s has %s milestones" % (workloadId, milestoneCount))
milestoneNumber = createMilestone(WACLIENT,workloadId,'Rev1')
logger.info("Created Milestone #%s called Rev1" % milestoneNumber)
logger.info("4 - STEP2 - List all Milestones")
milestones = listMilestones(WACLIENT,workloadId)
milestoneCount = jmespath.search("length([*].MilestoneNumber)",milestones)
logger.info("Now workload %s has %s milestones" % (workloadId, milestoneCount))
logger.info("4 - STEP3 - Retrieve the results from a milestone")
riskCounts = getMilestoneRiskCounts(WACLIENT,workloadId,milestoneNumber)
logger.info("Risk counts for all lenses for milestone %s are: %s " % (milestoneNumber,riskCounts))
logger.info("4 - STEP4 - List all question and answers based from a milestone")
answers = listAllAnswers(WACLIENT,workloadId,'wellarchitected',milestoneNumber)
# STEP 5 - Viewing and downloading the report
# https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/5_view_report/
logger.info("5 - Viewing and downloading the report")
logger.info("5 - STEP1 - Gather pillar and risk data for a workload")
lensReview = getLensReview(WACLIENT,workloadId,'wellarchitected')
logger.info("The Well-Architected base framework has the following RiskCounts %s " % lensReview['RiskCounts'])
logger.info("5 - STEP2 - Generate and download workload PDF")
lensReviewBase64PDF = getLensReviewPDFReport(WACLIENT,workloadId,'wellarchitected')
# lensReviewPDF = base64.b64decode(lensReviewBase64PDF)
# We will write the PDF to a file in the same directory
with open("WAReviewOutput.pdf", "wb") as fh:
fh.write(base64.b64decode(lensReviewBase64PDF))
# STEP 6 - Teardown
# https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/6_cleanup/
logger.info("6 - Teardown")
# Allow user to keep the workload
input("\n*** Press Enter to delete the workload or use ctrl-c to abort the script and keep the workload")
logger.info("6 - STEP1 - Delete Workload")
DeleteWorkload(WACLIENT, workloadId)