303
201

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

電話してサーバーを起動・停止する

Posted at

指定の電話番号に電話して、プッシュボタンを押すとサーバーを起動・停止出来る仕組みです。認証の箇所は事前に登録した電話番号のみから処理を受け付ける仕組みとしました。

処理フロー

Amazon Connectを使用しています。処理フローは下記の通りになります。

ec01.png

DynamoDBに事前に「サーバーの起動・停止」を許可する電話番号を登録しておきます。ユーザーが電話発信後、Amazon Connectは発信元電話番号を取得して、DynamoDB内に登録されている電話番号であるかを確認します。

  • 未登録の場合:「許可されてない番号です。」のアナウンスを流して切断します。
  • 登録済みの場合:下記の処理へ

EC2の起動状態を取得して、状態に応じて下記のアナウンスを流します。

  • 起動中の場合:EC2は起動中です。停止する場合は「1」を押してください。
  • 停止中の場合:EC2は停止中です。起動する場合は「1」を押してください。

ユーザは電話のキーパットから下記操作を行います。

  • 「1」を押さなかった場合:そのまま切断します。
  • 「1」を押した場合:EC2を起動または停止を行い、「処理が完了しました。」のアナウンス後、切断します。

DynamoDB

ec2call-numberというテーブルを作成します。パーティションキーはPhoneNumberとします。

ec2call02.png

PhoneNumberに電話番号、PermitOKと入力します。ここに入力した番号からのEC2起動・停止が許可されます。

ec2call03.png

Lambda

Lambda関数を3つ作成します。

電話番号検索用Lamdba関数

Amazon Connectから発信元電話番号を取得後、その電話番号がDynamoDBに登録されているかを確認する関数になります。登録済みの場合permit_valueOKを、未登録の場合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

Amazon Connectのインスタンス作成、電話番号取得後、コンタクトフローを作成して、電話番号に紐づけます。下記は全体のコンタクトフローになり、処理内容は下記になります。

  • 青枠の箇所:登録されている電話番号か確認
  • 黄色の箇所:EC2のステータス取得
  • 紫色の箇所:EC2の起動・停止

ec03.png

登録されている電話番号か確認

AWS Lambda関数という箇所で「電話番号検索用Lamdba関数」を実行しています。後続の「コンタクト属性の設定」箇所でLambda関数の戻り値'Permit': permit_valueを取得しています。その後、「コンタクト属性を確認する」でpermit_valueの値を確認して、OK(登録済みの電話番号からの着信)であれば後続の処理へ、その他(未登録電話番号からの着信)であれば「許可されていない電話番号です。」とプロンプトを再生して終了します。

ec2call05.png

EC2のステータス取得

AWS Lambda関数という箇所で「EC2ステータス確認用Lamdba関数」を実行しています。後続の「コンタクト属性の設定」箇所でLambda関数の戻り値'Status': status_valueおよび'Operate': operate_valueを取得しています。戻り値によって後続の処理「EC2を起動する or EC2を停止する」は変化します。

ec2call06.png

EC2の起動・停止

「顧客の入力を取得する」で下記アナウンスを流します。アナウンスはEC2のステータスによって変化します。

  • EC2起動中の場合:「EC2は起動中です。停止する場合は1を押してください。」
  • EC2停止中の場合:「EC2は停止中です。起動する場合は1を押してください。」

「1」入力後、AWS Lambda関数という箇所で「EC2ステータス変更用Lamdba関数」を実行しています。EC2を起動または停止後、「処理が完了しました。」のアナウンスを流して終了します。

ec2call07.png

まとめ

EC2の起動・停止処理を電話一本で実施することはあまりないと思いますが、他に何か良いアイデアが思いつけば応用したいと思います。

303
201
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
303
201

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?