指定の電話番号に電話して、プッシュボタンを押すとサーバーを起動・停止出来る仕組みです。認証の箇所は事前に登録した電話番号のみから処理を受け付ける仕組みとしました。
Amazon Connectを使用しています。処理フローは下記の通りになります。
DynamoDBに事前に「サーバーの起動・停止」を許可する電話番号を登録しておきます。ユーザーが電話発信後、Amazon Connectは発信元電話番号を取得して、DynamoDB内に登録されている電話番号であるかを確認します。
- 未登録の場合:「許可されてない番号です。」のアナウンスを流して切断します。
- 登録済みの場合:下記の処理へ
EC2の起動状態を取得して、状態に応じて下記のアナウンスを流します。
- 起動中の場合:EC2は起動中です。停止する場合は「1」を押してください。
- 停止中の場合:EC2は停止中です。起動する場合は「1」を押してください。
ユーザは電話のキーパットから下記操作を行います。
- 「1」を押さなかった場合:そのまま切断します。
- 「1」を押した場合:EC2を起動または停止を行い、「処理が完了しました。」のアナウンス後、切断します。
ec2call-numberというテーブルを作成します。パーティションキーはPhoneNumberとします。
PhoneNumberに電話番号、PermitにOKと入力します。ここに入力した番号からのEC2起動・停止が許可されます。
Lambda関数を3つ作成します。
電話番号検索用Lamdba関数
Amazon Connectから発信元電話番号を取得後、その電話番号がDynamoDBに登録されているかを確認する関数になります。登録済みの場合permit_valueにOKを、未登録の場合NGを返します。
ec2-call-01.py
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ステータス確認用Lamdba関数
EC2のステータスを確認後、変数に値を格納します。
- EC2が
runningの場合:status_valueに起動を格納、operate_valueに停止を格納 - EC2が
stoppedの場合:status_valueに停止を格納、operate_valueに起動を格納
ec2-call-02.pyimport json
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ステータス変更用Lamdba関数
EC2のステータスを起動・停止します。
-
operate_valueが起動の場合:EC2を起動 -
operate_valueが停止の場合:EC2を停止
ec2-call-03.py
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 started'
elif operate_value == '停止':
ec2.stop_instances(InstanceIds=[instance_id])
action = 'EC2 stopped'
else:
print(f"Error: Unexpected Operate value: {operate_value}")
action = 'no action'
return { 'action': action }
Amazon Connectのインスタンス作成、電話番号取得後、コンタクトフローを作成して、電話番号に紐づけます。下記は全体のコンタクトフローになり、処理内容は下記になります。
- 青枠の箇所:登録されている電話番号か確認
- 黄色の箇所:EC2のステータス取得
- 紫色の箇所:EC2の起動・停止
登録されている電話番号か確認
AWS Lambda関数という箇所で「電話番号検索用Lamdba関数」を実行しています。後続の「コンタクト属性の設定」箇所でLambda関数の戻り値'Permit': permit_valueを取得しています。その後、「コンタクト属性を確認する」でpermit_valueの値を確認して、OK(登録済みの電話番号からの着信)であれば後続の処理へ、その他(未登録電話番号からの着信)であれば「許可されていない電話番号です。」とプロンプトを再生して終了します。
EC2のステータス取得
AWS Lambda関数という箇所で「EC2ステータス確認用Lamdba関数」を実行しています。後続の「コンタクト属性の設定」箇所でLambda関数の戻り値'Status': status_valueおよび'Operate': operate_valueを取得しています。戻り値によって後続の処理「EC2を起動する or EC2を停止する」は変化します。
EC2の起動・停止
「顧客の入力を取得する」で下記アナウンスを流します。アナウンスはEC2のステータスによって変化します。
- EC2起動中の場合:「EC2は起動中です。停止する場合は1を押してください。」
- EC2停止中の場合:「EC2は停止中です。起動する場合は1を押してください。」
「1」入力後、AWS Lambda関数という箇所で「EC2ステータス変更用Lamdba関数」を実行しています。EC2を起動または停止後、「処理が完了しました。」のアナウンスを流して終了します。
EC2の起動・停止処理を電話一本で実施することはあまりないと思いますが、他に何か良いアイデアが思いつけば応用したいと思います。







コメント