LINE から EC2 インスタンスを開始・停止させてみよう【API Gateway + Lambda】

当ページのリンクには広告が含まれています。

こんにちは、ふじみや です。

Amazon Web Services(AWS)はリザーブドインスタンスなどのサービスを除いて従量料金制ということもあり、インスタンスを使わない間は停止させておくのが基本です。

以前、AWS CLIを利用してPCのデスクトップからEC2を開始させたり、コマンドプロンプトを利用して停止させたりする方法についてご紹介をしましたが、例えば外出先でiPadを使ってUbuntuインスタンスにリモートデスクトップ接続をする際にはこの方法も使えず、結局Webコンソールやモバイルアプリ経由でEC2管理画面で対象のインスタンスを開始させて、と手間がかかってしまいます。

そこで、今回はPCがなくてもLINEを利用すればEC2を開始させたり停止させたりできるようになる方法についてご紹介をしたいと思います。

なお、今回の記事は以下のブログを参考にさせていただいております。

LineからEC2を操作する(Qiita)

目次

基本設計

今回は、AWSのAPI GatewayとLambda(ラムダ)の2つのサービスとLINE Botを連携させていきます。アーキテクチャとしては下図のようになります。

API Gatewayとは

APIとは Application Programming Interface(アプリケーション・プログラミング・インターフェース)の略で、ソフトウェアやプログラム同士をつなぐインターフェースのことです。

例えば、食べログなどで店舗情報を見るとGoogleマップが掲載されていたりすると思いますが、これは食べログがGoogleとAPI連携しているから表示できているんですね。

このように、あるソフトウェアやプログラム(アプリA)が別のソフトウェアやプログラム(アプリB)とやりとりして、アプリA上でアプリBの情報を表示させる、というのがAPI連携でできることです。

API GatewayはこういったAPIの公開、保守、管理などを行うツールで、外部からAPI Gatewayが受けたリクエストをLambdaに連携するといったかたちでよく利用されます。

Lambdaとは

LambdaはPythonやExcelが得意な方なら聞いたことがあるのではないかと思いますが、ご自身で新しい関数を定義することができる関数の名前です。Pythonだとラムダ式とか無名関数なんて呼ばれたりもしています。

前置きが長くなりましたが、AWSのLambdaは何らかのイベントが発生した際に記載されているコードを実行するというものです。

ですので、API GatewayとLambdaを連携することで、Lambdaがリクエストを受けとったことをトリガーとしてプログラムが実行される、ということになります。

なお、Lambdaによる処理時間の上限が15分と決まっていますので、大量のデータ処理などには利用せず、今回のような簡単なプログラムの実行程度に利用するようにしましょう。

LINE Botとは

LINE Botとは、LINE上で自動的に応答などの処理をするアカウントのことです。正確にはLINE Botというサービスはなく、LINE Developersに登録してボット用のアカウントを作成することになります。

今回は自動応答などの機能は含めず、単純にLINE→API Gateway→Lambdaとだけ処理が流れるようにしていきます。

IAMロールの作成

一連の流れを設定していく前に、まずはLambdaにEC2を操作する権限を作成しておきましょう。権限の付与についてはIAM(Identity and Access Management)というサービスを利用します。

IAMポリシーの作成

AWSのマネジメントコンソールより「IAM」と入力してIAMダッシュボードを表示させ、IAMリソース のロールに記載されている数値をクリックしてください。

表示された画面内の右上にある ポリシーを作成 をクリックし、サービス EC2 を選択してください。

次にアクションの「許可されるアクションをEC2で指定」で「start」と検索してStartInstances をチェック。同様に「stop」と検索して StopInstancesをチェックしましょう。

リソース では すべてのリソース をチェックして 次のステップ に進んでください。タグは任意で入力して次に進み、分かりやすいポリシー名を入力のうえ ポリシーの作成 をしましょう。

IAMロールの作成

左ペインにある ▼アクセス管理 より ロール をクリックし、先ほどのIAMロールの画面に戻ってください。

右上の ロールを作成 をクリックし、ユースケースに Lambda を選択し 次へ

先ほど作成したIAMポリシーの左側にあるチェックボックスをオンにし、 次へ をクリック。ロール名は任意で入力し、 ロールを作成 をクリックすればIAMロールの作成が完了します。

Lambda関数の作成

それではまずはLambdaで処理したいコードの記述をするところからやっていきましょう。

AWSのマネジメントコンソールより「lambda」と入力してLambdaの管理画面を開いて、関数を作成をクリックしてください。

関数の作成画面では 一から作成 を選択し、関数名は分かりやすい名前を入力。ランタイムは Python 3.9 を選択しましょう。

次に ▶ デフォルトの実行ロールの変更 をクリックして実行ロールの選択しを表示させ、「既存のロールを使用する」を選択し、既存のロールとして先ほど作成したIAMロールを選択してください。

あとはデフォルトのまま右下の 関数を作成 をクリックしてください。

すると、Lambdaの実行コードを入力する画面となりますので、次を貼付してください(入力先は デフォルトでlambda_function.py となっています)。LINEから開始または停止させたいインスタンスのIDを貼付するのを忘れないようにしましょう。

import json
import boto3
instance = ['i-xxxxxxxxxxxxxxx']
ec2 = boto3.client('ec2', region_name='ap-northeast-1')
def start_ec2():
    ec2.start_instances(InstanceIds=instance)
def stop_ec2():
    ec2.stop_instances(InstanceIds=instance)
def lambda_handler(event, context):
    # TODO implement
    text = event['events'][0]['message']['text']
    if text == '開始':
        start_ec2()
    elif text == '停止':
        stop_ec2()
    else:
        pass
    
    return {
        'statusCode': 200,
    }    

コードの作成が完了したら、コード入力箇所の上にある Deploy をクリックしてください。

これでLambda関数の作成は完了です。

API Gatewayの作成

次に API Gateway の作成と設定をしていきましょう。

Lambda関数の概要にある トリガーを追加 をクリック。

トリガーの設定 ではソースに API Gateway を選択して Intent は Create a new API を選択。API TypeREST API を選択し最後に Security Open に。これらの選択が完了したら 追加 をクリックして次に進んでください。

Lambdaの画面に戻ったら API Gateway の名前をクリックして設定画面に移動。

アクションをクリックし メソッドの作成 を選択。

新しく追加されたメソッドを POST とし、統合ポイントの設定では Lambdaプロキシ統合の使用 をチェックするとともに Lambda関数 を入力して保存してください。

上記の設定完了後はアクションをクリックし APIのデプロイ を選択。デプロイされるステージ は default としてデプロイをしてください。

API Gatewayの設定はこれで完了です。

LINEとの連携

最後に、LINEとAPI Gatewayを連携できるようにしましょう。

LINE Developersの利用

LINE Developersは企業や開発者に向けてLINEのサービスとの連携が可能になるAPI(以降、LINE APIと呼びます)を提供しています。LINEを使ったBotなどを運営する場合に利用するサービスといった程度にご認識いただければ問題ありません。

LINE Developersを利用するためにはサイト右上にある ログイン をクリックしてLINE Business IDのログイン画面を表示させてください。LINEのアカウントをお持ちの方であれば、LINEアカウントでログインをクリックしてご自身のLINEアカウントと連携をしましょう。なお、ご自身のLINEアカウントと連携させず、LINE Business ID用のアカウントを作成することも可能です。

ログイン方法に詰まった場合、LINE Developersコンソールへのログインをご参照ください。

プロバイダーの作成

LINEの認証が完了するとコンソールが表示されますが、このときコンソールが英語表記の場合には、右下に言語設定がありますので 日本語 を選択しましょう。

まずはBotを管理するプロバイダーを作成しましょう。

チャネルの作成

プロバイダー作成後にチャネル選択画面が表示されますので Messaging API を選択してください。

新規チャネル作成画面では入力必須の項目にはマークがされていますので、入力していってください。チャネル名などはご自身で分かるように付けて頂ければ十分です。入力後は規約に同意をして 作成 。確認画面が表示されますので、これも OK をクリック。情報利用についても 同意 をしましょう。

Messaging APIの設定(Webhook)

チャネルの基本設定が完了したら次に Messaging APIの設定 をしましょう。

Messaging API設定の中にある Webhook URL 編集。表示されたURLに API Gateway の APIエンドポイント を入力して 更新 をクリック。更新後は接続が出来るか 検証 をクリックして 成功 と出ればOKです。

APIエンドポイントはLambdaから確認する

検証後は Webhookの利用をオンにしてください(Webhookの再送とエラーの統計情報はお好みで)。

検証時にエラーが発生する場合

検証をクリックした際に「502 Bad Gateway」のエラーが発生し、検証が失敗することがあります。この場合、API Gatewayの設定画面にて POST 統合リクエスト をクリックし、Lambdaプロキシ統合の使用 のチェックを外してみてください(チェックを外した後は忘れずにデプロイしてくださいね)。

Messaging APIの設定(LINE公式アカウント機能)

LINE公式アカウントの機能については右側にある 編集 をクリック。機能の利用 にて「グループ・複数人トークへの参加を許可する」に変更をしましょう。写真や動画の受け取りやLIVE VROOM関連機能は利用をしませんのでそれぞれ「受け取らない」「利用しない」をチェックしておきます。

次にアカウント設定の左ペインにある応答設定をクリックし、あいさつメッセージと応答メッセージをそれぞれオフにしておきましょう。

これでLINE Developersの設定は完了です。

まとめ

最後にLINE BotをMessaging API設定の上部にあるQRコードから友達に追加してテストをしてみましょう。LINEからBotに対して「開始」とメッセージを打つと対象のインスタンスが起動されていれば完成です!

これでLINEが使える環境であれば簡単にEC2を開始させたり停止させたりすることができるようになりました。

何気に使えるBotですので、皆さんも是非試してみてくださいね。

それではまた。

この記事が気に入ったら
フォローしてね!

コメント

コメントする

目次