6
0

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

本記事は、BIPROGY / ユニアデックス社内AWSコミュニティ「BIPROGY AWS Ambassador」の定期投稿企画第11回目の記事です。他の定期投稿企画の記事は、#BIPROGY_AWS_Ambassadorタグ または Organizationページ をご覧ください。

ロングヘアーの、前髪がぱっつんの女性が、スマートスピーカーから、クラウドのサーバを立ち上げるイメージ.png

1. はじめに

「AWSを(EC2を) 声だけで起動できたら ネタにできない? 楽じゃない?」

と ふと思い立ち、AlexaとAWSを連携させて、音声でクラウド上のサーバーを起動する仕組みを作ってみました。
果たして需要があるのか疑問なところはありますが この記事では、その手順や実際に動かしてみた感想などをまとめてみました👀

2. 今回準備したもの

コンポーネント 役割・目的
Echo デバイス(Alexa) 音声入力を受け付け、Alexa Skills Kit に送信する。
(お家にありました)
AWS アカウント EC2 インスタンスを管理するための基盤。
EC2 インスタンス 起動対象のサーバー。Alexa 経由で操作されるリソース。
Alexa Skills Kit(ASK) 音声コマンドを定義し、Lambda にリクエストを送信する。
AWS Lambda Alexa からのリクエストを受け、EC2 インスタンスを起動・停止する関数を実行する。
IAM Role/Policy Lambda に EC2 操作権限(起動・停止など)を付与するためのアクセス制御。

3. 実装ステップ

1. Alexa Developer Console で「スキル」を作成する

1. スキルの基本情報を登録する

① Alexa Developer Console にログイン

②「Create Skill」をクリック

【名前、ロケール】
  • スキル名:好きな名前 (例:クラウドサーバーの操作)
  • プライマリロケール:日本語

スクリーンショット_19-11-2025_9200_developer.amazon.com.jpeg

【エクスペリエンス、モデル、ホスティングサービス】
  • エクスペリエンス:その他
  • モデル:カスタム
  • ホスティングサービス:独自のプロビジョニング

Developer Console - 20251119092504.png

【テンプレート】
  • テンプレート:スクラッチで作成

Developer Console - 20251119093306.png

2. スキルに対して「インテント」を定義する

① 上部メニューの「ビルド」をクリック

Developer Console - 20251119100651.png

② 「Interaction Model」→「Intents」→「Add Intent」をクリック

Developer Console - 20251119100932.png

③ サーバー起動・停止・状態確認用の Intent を作成

Developer Console - 20251119101220.png

【サーバー起動】

StartServerInstanceIntent

【サーバー停止】

StopServerInstanceIntent

【サーバー状態確認】

QueryInstanceStatusIntent

④ 各 インテント に対して「サンプル発話」を追加

Developer Console - 20251119101335.png

Developer Console - 20251119101708.png

【サーバー起動】

サーバーを起動して
開けゴマ

【サーバー停止】

サーバーを停止して
サーバーを封印して

【サーバー状態確認】

サーバーの状態を教えて
息してるか

Saveを忘れずに(忘れがち)。

3. スキルをビルドして検証

① 上部の「Build Skill」をクリック

Developer Console - 20251119103342.png

【ビルドに問題が無いときの画面】 Error ログが表示されなければ ビルドOKです。

Developer Console - 20251119103740.png

2. AWS Management Console で 「Lambda関数」を作成する

1. Lambda関数コードを記載

① AWS Managed Console にログイン

① Lambda にアクセスし、「関数を作成」をクリック

今回は、Python関数で、「Alexa」という関数を作成しました。
boto3ライブラリを使ってEC2インスタンスを起動するコードを書きます。

【Python コード】
import boto3

def lambda_handler(event, context):
    intent_name = event['request']['intent']['name']
    
    # 固定のインスタンスIDとリージョン
    instance_id = '<インスタンスID>'
    region = 'ap-northeast-1'
    ec2 = boto3.client('ec2', region_name=region)

    if intent_name == 'StartServerInstanceIntent':
        # EC2インスタンスを起動
        try:
            response = ec2.start_instances(InstanceIds=[instance_id])
            message = "サーバーを起動しました。"
        except Exception as e:
            message = f"サーバーの起動に失敗しました: {str(e)}"

    elif intent_name == 'StopServerInstanceIntent':
        # EC2インスタンスを停止
        try:
            response = ec2.stop_instances(InstanceIds=[instance_id])
            message = "サーバーを停止しました。"
        except Exception as e:
            message = f"サーバーの停止に失敗しました: {str(e)}"

    elif intent_name == 'QueryInstanceStatusIntent':
        # EC2インスタンスの状態を確認
        try:
            response = ec2.describe_instances(InstanceIds=[instance_id])
            state = response['Reservations'][0]['Instances'][0]['State']['Name']
            status_map = {
                'running': '起動中',
                'stopped': '停止中',
                'pending': '起動処理中',
                'stopping': '停止処理中',
                'terminated': '削除済み'
            }
            message = f"サーバーは{status_map.get(state, state)}です。"
        except Exception as e:
            message = f"ステータスの取得に失敗しました: {str(e)}"

    else:
        message = '申し訳ありません、その操作には対応していません。'

    # Alexaへの応答を返す
    return {
        'version': '1.0',
        'response': {
            'outputSpeech': {
                'type': 'PlainText',
                'text': message
            },
            'shouldEndSession': True
        }
    }

2. Lambda関数のトリガーを追加

① Alexa スキルID をコピー

Alexa Developer Console へアクセスし、スキル名の下に記載されている Alexa のスキルID をコピーします。

Amazon Alexa Console - Amazon Alexa Official Site - 20251119115319.png

② Lambdaの「トリガーを追加」をクリック

AWS Managed Console に戻り、以下を入力します。

  • ソース:Alexa
  • Alexa 製品を選択:Alexa Skills Kit
  • スキル ID 検証:有効
  • スキルID:先ほどコピーした Alexa スキルID

トリガーを追加 - Lambda - 20251119114928.png

Alexa - 関数 - Lambda - 20251119115216.png


3. Lambda関数のエンドポイント(AWS Lambda の ARN)を設定

Alexa スキルのエンドポイントに Lambda ARN を設定することで、音声コマンドが Lambda に届くようになります。

① Lambda の ARN をコピー

arn:aws:lambda:ap-northeast-1:<AWSアカウントID>:function:<Lambda関数名>

② 「Endpoint」をクリック

③ 全てのリージョンに対して、Lambda ARN をペースト

Developer Console - 20251119105558.png

Saveを忘れずに(忘れがち)。

4. Lambda関数用の IAMロール の設定

① IAMで、Lambda関数用のIAMロールを作成

Lambdaに対して、EC2を操作する権限を与えるIAMロールを作成し、Lambdaにアタッチします。

Alexa-role - IAM - Global - 20251119115607.png

Alexa-role - IAM - Global - 20251119115711.png

Alexa - 関数 - Lambda - 20251119115818.png

【IAMポリシーJSONコード】
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:DescribeInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

4. 実際に声で操ってみた

Echo Dotに向かって 「アレクサ、クラウドサーバー操作で 開けゴマ」 と話しかけると 「サーバーを起動しました。」 と応答が。

数秒後にEC2インスタンスが起動⚡

35f19b5e-a177-4254-8248-8c41b673f02f.png

CloudWatchログにも起動処理の記録が残っていて、正常に起動されていることが確認できました。

5. 苦労したポイント

一番苦労したのは Lambda のデフォルトのタイムアウト秒数設定でした。
3 秒がデフォルト設定なのですが、これが原因で、何度テストをしてもうまく動かず。

もしやと思い、タイムアウトを 20 秒まで伸ばしたところ、うまく起動するようになりました。

Alexa - 関数 - Lambda - 20251119131443.png

シンプルなのですが、これが原因と気付くのに時間がかかりました…

6. 応用アイデア

今回は、EC2を対象とした声での操作だけでしたが、応用すれば

  • 自宅に帰宅すると同時にAlexaが人を検知し、そこからインスタンスを起動
  • スマートホームと連携して、家の照明とサーバーを同時に起動・停止

EC2以外のリソースに対しても、

  • S3やRDSなど、他のAWSサービスとの連携
  • 「RDSをバックアップして」→ 自動でスナップショットを作成
  • 「今月のAWSコストは?」→ Cost Explorer APIで取得し、Alexaが読み上げ
  • 「予算超過したら通知して」→ SNS+Alexa通知

なんてことも可能ですね!🚀

7. まとめ

「マウス不要でクラウド操作」を実現しましたが、その環境を作るにはマウスが必要という矛盾。
それでも、AlexaとAWSは同じAmazon製なので連携設定は驚くほどスムーズです。

お家で眠っているAlexaがあれば、単なるスピーカーから脱却させて、クラウドエンジニアの相棒にしてみませんか?🔥


We Are Hiring!

6
0
0

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
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?