我試圖創建一個執行以下操作的函式。(不知道是否值得一提,但這個函式是由另一個函式呼叫的)
- 使用 boto3 連接到 aws 資源
- 獲取 sqs 佇列中可用的訊息數
- 統計ec2實體的數量
- 根據 sqs 佇列和 ec2 實體評估一組條件,然后不執行任何操作或寫入 sns 主題。
基本上,每次 sqs 佇列很高并且正在消化這些的 ec2 實體數量很少時,我都想向 sns 主題發布一條訊息。
import os
import boto3
import logging
import types
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Create session and clients
sts_client = boto3.client('sts')
sqs_client = boto3.client('sqs')
ec2_client = boto3.client('ec2')
sns_client = boto3.client('sns')
# Call the assume_role method of the STSConnection object and pass the role ARN and a role session name.
assumed_role_object = sts_client.assume_role(
RoleArn=os.environ['ROLE_ARN'],
RoleSessionName="AssumeRoleFromCloudOperations"
)
# From the response that contains the assumed role, get the temporary credentials
credentials = assumed_role_object['Credentials']
assumed_role_session = boto3.Session(
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken']
)
# Check the queue size
def sqs():
queue_size = sqs_client.get_queue_attributes(
QueueUrl=os.environ['SQS_QUEUE_URL'],
AttributeNames=['ApproximateNumberOfMessages']
)
messages = int(queue_size["Attributes"]["ApproximateNumberOfMessages"])
return messages
# Count the number of active ec2 instances
def count_instances(ec2):
total_instances = 0
instances = ec2.instances.filter(Filters=[
{
'Instance State': 'instance-state-name',
'Values': ['running'],
'Name': 'tag:Name',
'Values': ['NameOfInstance']
},
])
for _ in instances:
total_instances = 1
return total_instances
print(f"Total number of active scan servers is: {total_instances}")
# Define the SNS Topic which will be integrated with OpsGenie
def sns():
topicArn = os.environ['SNS_ARN']
# Evaluate the set of conditions
def evaluate_conditions(context, event):
sqs()
if messages > int(os.environ['AVG_QUEUE_SIZE']) and count_instances.total_instances > int(os.environ['AVG_NR_OF_EC2_SCAN_SERVERS']):
print('False alert')
logger.info()
elif messages < int(os.environ['AVG_QUEUE_SIZE']) and count_instances.total_instances < int(os.environ['AVG_NR_OF_EC2_SCAN_SERVERS']):
print('False alert')
logger.info()
elif messages < int(os.environ['AVG_QUEUE_SIZE']) and count_instances.total_instances > int(os.environ['AVG_NR_OF_EC2_SCAN_SERVERS']):
print('False alert')
logger.info()
else:
sns.publish(TopicArn=os.environ['SNS_ARN'],
Message='sameple message',
Subject='sample subject')
print("Published to SNS Topic")
處理程式是 handler.evaluate_conditions
我的問題是我如何在這個 lambda 函式中有一些結構?當我運行該函式時,出現命名錯誤:
{
"errorMessage": "name 'messages' is not defined",
"errorType": "NameError",
"stackTrace": [
" File \"/var/task/mdc_alert/handler.py\", line 67, in evaluate_conditions\n if messages > int(os.environ['AVG_QUEUE_SIZE']) and count_instances.total_instances > int(\n"
]
}
所以似乎我不能在evaluate_conditions() 函式中使用訊息變數。如何使“message”和“total_instances”變數在evaluate_conditions() 函式中可用?
我完全基于谷歌搜索、stackoverflow 和 boto3 檔案撰寫了這個函式,因為我沒有任何編程經驗。
這種結構有什么好處,還是需要徹底檢修?我是否需要更改函式的順序,或者創建一個類?
uj5u.com熱心網友回復:
直接的問題是messages變數沒有定義。您的sqs函式回傳一個值,但由于您在 void 背景關系中呼叫它,因此您實際上并未對該值執行任何操作。您可以通過更改此行來解決此問題:
sqs()
對這個:
messages = sqs()
我還看到 count_instances 函式存在一些問題。它期望接收一個ec2變數,但您從評估條件中錯誤地呼叫了它。您可以將 ec2_client 變數傳遞給它,也可以直接從函式內部使用 ec2_client 變數。
我建議重命名您的函式以更準確地反映它們的回傳值:
sqs -> sqs_msg_count
count_instances -> running_ec2_count
進行這些更改將允許您重構評估條件以縮短 if-then 行,從而使您的代碼整體更易于閱讀和遵循。如果您考慮了所有這些建議,您的代碼可能如下所示:
# Check the queue size
def sqs_msg_count():
messages = sqs_client.get_queue_attributes(
QueueUrl=os.environ['SQS_QUEUE_URL'],
AttributeNames=['ApproximateNumberOfMessages']
)
return int(messages["Attributes"]["ApproximateNumberOfMessages"])
# Count the number of active ec2 instances
def running_instance_count():
running_instances = ec2_client.instances.filter(Filters=[
{
'Instance State': 'instance-state-name',
'Values': ['running'],
'Name': 'tag:Name',
'Values': ['NameOfInstance']
},
])
return len(running_instances)
# Evaluate the set of conditions
def evaluate_conditions(context, event):
sqs_count = sqs_msg_count()
sqs_average = int(os.environ['AVG_QUEUE_SIZE'])
ec2_count = running_instance_count()
ec2_average = int(os.environ['AVG_NR_OF_EC2_SCAN_SERVERS'])
if sqs_count > sqs_average and ec2_count > ec2_average:
print('False alert')
logger.info()
elif sqs_count < sqs_average and ec2_count < ec2_average:
print('False alert')
logger.info()
elif sqs_count < sqs_average and ec2_count > ec2_average:
print('False alert')
logger.info()
else:
sns_client.publish(
TopicArn=os.environ['SNS_ARN'],
Message='sameple message',
Subject='sample subject'
)
print("Published to SNS Topic")
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329435.html
下一篇:函式內的百分比格式
