指定的電話號碼撥打電話並按下按鈕,可以啟動或停止伺服器的機制。認證部分是僅接受事前註冊的電話號碼處理的機制。
使用 Amazon Connect。處理流程如下所示。

在 DynamoDB 中事先註冊“伺服器的啟動・停止”允許的電話號碼。用戶撥打電話後,Amazon Connect 獲取來電號碼,並確認該號碼是否已註冊於 DynamoDB 中。
獲取 EC2 的啟動狀態,並根據狀態播放下列公告。
用戶可以從電話的按鍵上執行以下操作。
建立名為 ec2call-number 的資料表。分區鍵為 PhoneNumber。

在 PhoneNumber 中輸入電話號碼,在 Permit 中輸入 OK。這裡輸入的號碼將被允許進行 EC2 的啟動或停止。

創建三個 Lambda 函數。
從 Amazon Connect 獲取來電電話號碼,並確認該號碼是否已在 DynamoDB 中註冊。若已註冊則返回 permit_value 為 OK,未註冊則為 NG。
import json
import boto3
dynamodb = boto3.client('dynamodb', region_name='ap-northeast-1')
def lambda_handler(event, context):
# 從 Amazon Connect 獲取來電電話號碼
contact_data = event['Details']['ContactData']
phone_number = contact_data['CustomerEndpoint']['Address']
response = dynamodb.get_item(
TableName='ec2call-number',
Key={'PhoneNumber': {'S': phone_number}}
)
# 在 DynamoDB 中搜尋電話號碼
if 'Item' in response:
permit_value = response['Item']['Permit']['S']
else:
permit_value = 'NG'
return_value = {
'Permit': permit_value
}
return return_value
確認 EC2 的狀態後,在變數中儲存值。
running:在 status_value 中儲存 啟動,在 operate_value 中儲存 停止stopped:在 status_value 中儲存 停止,在 operate_value 中儲存 啟動import boto3
ec2 = boto3.client('ec2', region_name='ap-northeast-1')
def lambda_handler(event, context):
instance_id = 'i-0xxxxxxxxxxxxxxxx' # 請輸入實例 ID
# 獲取 EC2 實例的狀態
response = ec2.describe_instances(InstanceIds=[instance_id])
instance = response['Reservations'][0]['Instances'][0]
instance_state = instance['State']['Name']
# 根據狀態設定返回值
if instance_state == 'running':
status_value = '啟動'
operate_value = '停止'
elif instance_state == 'stopped':
status_value = '停止'
operate_value = '啟動'
else:
status_value = instance_state
operate_value = '不明'
return_value = {
'Status': status_value,
'Operate': operate_value
}
return return_value
將 EC2 的狀態切換為啟動或停止。
operate_value 為 啟動:啟動 EC2operate_value 為 停止:停止 EC2import json
import boto3
ec2 = boto3.client('ec2', region_name='ap-northeast-1')
def lambda_handler(event, context):
attributes = event['Details']['ContactData']['Attributes']
operate_value = attributes.get('Operate')
instance_id = 'i-0xxxxxxxxxxxxxxxx' # 請輸入實例 ID
if operate_value == '啟動':
ec2.start_instances(InstanceIds=[instance_id])
action = 'EC2 已啟動'
elif operate_value == '停止':
ec2.stop_instances(InstanceIds=[instance_id])
action = 'EC2 已停止'
else:
print(f"錯誤:意外的 Operate 值:{operate_value}")
action = '無行動'
return {'action': action}
在創建 Amazon Connect 實例和獲取電話號碼後,創建聯絡流程並將其與電話號碼關聯。以下是整體的聯絡流程,其處理內容如下。

在 AWS Lambda 函數中執行「電話號碼搜尋用 Lambda 函數」。在隨後的「聯絡屬性的設定」處獲取 Lambda 函數的返回值 ‘Permit’: permit_value。之後,在「確認聯絡屬性」中檢查 permit_value 值,若為 OK(即來自註冊電話號碼的來電),則進入後續處理;若為其他(即來自未註冊電話號碼的來電),則播放「該號碼未獲得許可。」的提示並結束。

在 AWS Lambda 函數中執行「EC2 狀態確認用 Lambda 函數」。在隨後的「聯絡屬性的設定」處獲取 Lambda 函數的返回值 ‘Status’: status_value 及 ‘Operate’: operate_value。返回值會影響後續處理「啟動 EC2 或 停止 EC2」。

在「獲取客戶輸入」時播放以下公告,公告內容根據 EC2 的狀態而有所不同。
在輸入「1」後,在 AWS Lambda 函數中執行「EC2 狀態變更用 Lambda 函數」。在啟動或停止 EC2 後,播放「處理已完成。」的公告並結束。

雖然透過電話進行 EC2 的啟動・停止處理的情況並不常見,但如果有其他好的創意,我會考慮加以應用。