🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

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

處理流程

使用 Amazon Connect。處理流程如下所示。

ec01.png

在 DynamoDB 中事先註冊“伺服器的啟動・停止”允許的電話號碼。用戶撥打電話後,Amazon Connect 獲取來電號碼,並確認該號碼是否已註冊於 DynamoDB 中。

  • 未註冊的情況:「該號碼未獲得許可。」的消息會播放並斷線。
  • 已註冊的情況:進入下列處理

獲取 EC2 的啟動狀態,並根據狀態播放下列公告。

  • 正在運行的情況:EC2 當前正在運行。若要停止請按「1」。
  • 停止中的情況:EC2 當前已停止。若要啟動請按「1」。

用戶可以從電話的按鍵上執行以下操作。

  • 未按「1」的情況:將立即斷線。
  • 按下「1」的情況:將執行 EC2 的啟動或停止,並在播放「處理已完成。」的消息後,斷線。

DynamoDB

建立名為 ec2call-number 的資料表。分區鍵為 PhoneNumber

ec2call02.png

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

ec2call03.png

Lambda

創建三個 Lambda 函數。

電話號碼搜尋用 Lambda 函數

從 Amazon Connect 獲取來電電話號碼,並確認該號碼是否已在 DynamoDB 中註冊。若已註冊則返回 permit_valueOK,未註冊則為 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 狀態確認用 Lambda 函數

確認 EC2 的狀態後,在變數中儲存值。

  • 若 EC2 為 running:在 status_value 中儲存 啟動,在 operate_value 中儲存 停止
  • 若 EC2 為 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 狀態變更用 Lambda 函數

將 EC2 的狀態切換為啟動或停止。

  • operate_value啟動:啟動 EC2
  • operate_value停止:停止 EC2
import 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

在創建 Amazon Connect 實例和獲取電話號碼後,創建聯絡流程並將其與電話號碼關聯。以下是整體的聯絡流程,其處理內容如下。

  • 藍框行:確認是否為註冊的電話號碼
  • 黃框行:獲取 EC2 的狀態
  • 紫框行:進行 EC2 的啟動・停止

ec03.png

確認是否為註冊的電話號碼

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

ec2call05.png

獲取 EC2 狀態

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

ec2call06.png

EC2 的啟動・停止

在「獲取客戶輸入」時播放以下公告,公告內容根據 EC2 的狀態而有所不同。

  • 若 EC2正在啟動中:「EC2 當前正在運行。若要停止請按 1。」
  • 若 EC2已停止中:「EC2 當前已停止。若要啟動請按 1。」

在輸入「1」後,在 AWS Lambda 函數中執行「EC2 狀態變更用 Lambda 函數」。在啟動或停止 EC2 後,播放「處理已完成。」的公告並結束。

ec2call07.png

總結

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


原文出處:https://qiita.com/infra365/items/1d329dbb79e1bf148e63


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝20   💬4   ❤️6
638
🥈
我愛JS
📝1   💬4   ❤️2
46
🥉
酷豪
1
#5
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付