本記事は、BIPROGY / ユニアデックス社内AWSコミュニティ「BIPROGY AWS Ambassador」の定期投稿企画第11回目の記事です。他の定期投稿企画の記事は、#BIPROGY_AWS_Ambassadorタグ または Organizationページ をご覧ください。
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」をクリック
【名前、ロケール】
- スキル名:
好きな名前 (例:クラウドサーバーの操作) - プライマリロケール:
日本語
【エクスペリエンス、モデル、ホスティングサービス】
- エクスペリエンス:
その他 - モデル:
カスタム - ホスティングサービス:
独自のプロビジョニング
【テンプレート】
- テンプレート:
スクラッチで作成
2. スキルに対して「インテント」を定義する
① 上部メニューの「ビルド」をクリック
② 「Interaction Model」→「Intents」→「Add Intent」をクリック
③ サーバー起動・停止・状態確認用の Intent を作成
【サーバー起動】
StartServerInstanceIntent
【サーバー停止】
StopServerInstanceIntent
【サーバー状態確認】
QueryInstanceStatusIntent
④ 各 インテント に対して「サンプル発話」を追加
【サーバー起動】
サーバーを起動して
開けゴマ
【サーバー停止】
サーバーを停止して
サーバーを封印して
【サーバー状態確認】
サーバーの状態を教えて
息してるか
Saveを忘れずに(忘れがち)。
3. スキルをビルドして検証
① 上部の「Build Skill」をクリック
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 をコピーします。
② Lambdaの「トリガーを追加」をクリック
AWS Managed Console に戻り、以下を入力します。
- ソース:
Alexa - Alexa 製品を選択:
Alexa Skills Kit - スキル ID 検証:
有効 - スキルID:
先ほどコピーした Alexa スキルID
3. Lambda関数のエンドポイント(AWS Lambda の ARN)を設定
Alexa スキルのエンドポイントに Lambda ARN を設定することで、音声コマンドが Lambda に届くようになります。
① Lambda の ARN をコピー
arn:aws:lambda:ap-northeast-1:<AWSアカウントID>:function:<Lambda関数名>
② 「Endpoint」をクリック
③ 全てのリージョンに対して、Lambda ARN をペースト
Saveを忘れずに(忘れがち)。
4. Lambda関数用の IAMロール の設定
① IAMで、Lambda関数用のIAMロールを作成
Lambdaに対して、EC2を操作する権限を与えるIAMロールを作成し、Lambdaにアタッチします。
【IAMポリシーJSONコード】
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:DescribeInstances",
"ec2:StopInstances"
],
"Resource": [
"*"
]
}
]
}
4. 実際に声で操ってみた
Echo Dotに向かって 「アレクサ、クラウドサーバー操作で 開けゴマ」 と話しかけると 「サーバーを起動しました。」 と応答が。
数秒後にEC2インスタンスが起動⚡
CloudWatchログにも起動処理の記録が残っていて、正常に起動されていることが確認できました。
5. 苦労したポイント
一番苦労したのは Lambda のデフォルトのタイムアウト秒数設定でした。
3 秒がデフォルト設定なのですが、これが原因で、何度テストをしてもうまく動かず。
もしやと思い、タイムアウトを 20 秒まで伸ばしたところ、うまく起動するようになりました。
シンプルなのですが、これが原因と気付くのに時間がかかりました…
6. 応用アイデア
今回は、EC2を対象とした声での操作だけでしたが、応用すれば
- 自宅に帰宅すると同時にAlexaが人を検知し、そこからインスタンスを起動
- スマートホームと連携して、家の照明とサーバーを同時に起動・停止
EC2以外のリソースに対しても、
- S3やRDSなど、他のAWSサービスとの連携
- 「RDSをバックアップして」→ 自動でスナップショットを作成
- 「今月のAWSコストは?」→ Cost Explorer APIで取得し、Alexaが読み上げ
- 「予算超過したら通知して」→ SNS+Alexa通知
なんてことも可能ですね!🚀
7. まとめ
「マウス不要でクラウド操作」を実現しましたが、その環境を作るにはマウスが必要という矛盾。
それでも、AlexaとAWSは同じAmazon製なので連携設定は驚くほどスムーズです。
お家で眠っているAlexaがあれば、単なるスピーカーから脱却させて、クラウドエンジニアの相棒にしてみませんか?🔥
We Are Hiring!



















