AWS API Gateway (HTTP API型) でEC2状態取得

AWS
この記事は約6分で読めます。
記事内に広告が含まれています。

API Gatewayの概念は理解しているつもりですが、実際に触れることがほぼなかったため、勉強の為に少し触れてみました。本記事ではAPI Gatewayの「HTTP API型」でHello worldを実施したのち、Lambda関数を少し改造して任意EC2の状態を取得できるようにしてみます。なお、本記事では認証には触れません。作成したAPIはインターネット上から叩くことが出来るため注意が必要です。

いざ、入門します。

API Gatewayについて

Amazon API Gateway とは何ですか?

Amazon API Gateway は、あらゆる規模の REST、HTTP、および WebSocket API を作成、公開、維持、モニタリング、およびセキュア化するための AWS のサービスです。

Amazon API Gateway とは何ですか? - Amazon API Gateway
Amazon API Gateway とその機能の概要。

API Gatewayは大きく以下の種類があるようです。

  • REST API
  • HTTP API

HTTP APIのほうが後から登場していますが、必要最低限の機能に絞られているようです。今回はLabmda関数と簡単に連携するだけなので「HTTP API」を使っていきます。

HTTP API と REST API

公式サイトに両方の差分が表ベースで記載されています。多機能なのはREST APIです。

REST API と HTTP API 間で選択する - Amazon API Gateway
REST API と HTTP API の違いについて説明します。

API Gateway入門作成

最初にHello wordを試します。

では早速、公式サイトにチュートリアルに沿って「Hello world」してみます。

API Gateway の開始方法 - Amazon API Gateway
API Gateway を開始します。AWS Lambda 関数を呼び出し、その関数のレスポンスをクライアントに返す Amazon API Gateway HTTP API の作成について学びます。

次の手順で進めます。

  1. Lambda関数を作成する。
  2. API Gateway(HTTP API型)を作成する。
  3. Hello world出来るかな。

最初に、Lambda関数を作成しますが、今回は「Python」で作成してみます。デフォルトでHello Worldが返す関数が作成されるため、スムーズです。

名前は「my-function2」としてランタイム「Python 3.8」を選択します。後は特に変更していません。
作成されました。最初からHelloを返すようになってました。

Lambda関数作成と同時に、本関数用のロールも合わせて作成されました。

次にAPI Gateway(HTTP API側)を作成していきます。この処理で先ほど作ったLambda関数を呼び出すようにします。

HTTP APIで構築を進めます。
統合でLambdaを選び先ほど作成した関数を選びます。API名は「my-http-api1」としました。確認して作成します。
補足事項1

Lambda関数設定時のバージョンとは?
→ バージョン「2.0」はAPI Gateway側がうまい具合に解釈してくれて、簡単なレスポンス形式の記述が出来るようです。2.0でも1.0のような記述は出来るため2.0を選択すれば確実かと思います。

HTTP API の AWS Lambda プロキシ統合の使用 - Amazon API Gateway
HTTP API AWS Lambda 統合の開発について説明します。
確認画面が表示されるため「作成」します。
補足事項2

■ルートとは?
→ PUT、GET等のHTTPメソッドのことです。今回は特に指定しないのでデフォルトの「ANY」としています。

■ステージとは?
→ バージョン管理のようなものらしいです(今回詳細は割愛します)。

なお、API Gateway作成と同時にLambda関数のポリシーステートメントに自動で追加されます(該当API GatewayからのLambda関数が許可された)。

作成したAPI GatewayにURLがあります。

「API URL / Lambda関数名」でアクセスしてみます。

例:https://hoge.excute-api.ap-northeast-1.amazonaws.com/my-function2

“Hello from Lambda!”

次にEC2状態取得用に改造します。

せっかくなので、任意インスタンスIDを入力引数にして、EC2状態(stoppedやrunning等)を返すように改造してみます。

次の手順で進めます。

  1. Lambda関数のロールにEC2アクセス用ポリシを追加する。
  2. Lambda関数を改造する。
  3. インスタンスIDを引数に状態取得が出来るかな。
Lambda関数のロールに「AmazonEC2ReadOnlyAccess」ポリシーをアタッチします。

次のようにLambda関数を改造します。

import json
import boto3

def lambda_handler(event, context):

    state = "unknown"
    try:
        id = event['queryStringParameters']['id']
        ec2 = boto3.client('ec2')
        response = ec2.describe_instances(
            Filters=[ {'Name':'instance-id','Values':[id] }, ]
        )
        state =  response['Reservations'][0]['Instances'][0]['State']['Name']
    except Exception as e:
        print(e)
        return {
            'statusCode': 500,
            'body': json.dumps('internal server error')
        }

    print(state)
    return {
        'statusCode': 200,
        'body': json.dumps(state)
    }
関数のポイント
  • 入力引数はeventのqueryStringParametersに入ってきます。今回は引数名を「id」という名前で指定するため[queryStringParameters][id]で値を取得します。
  • EC2状態取得はboto3ライブラリを使います。
  • エラー系はまとめて500を返します。

「API URL / Lambda関数名?id=インスタンスID」でアクセスしてみます。

例:https://hoge.excute-api.ap-northeast-1.amazonaws.com/my-function2?id=1234567890

“stopped”
“running”

IDを省略したり、誤ったIDを入力した場合はエラーが返ります。

まとめ

本記事ではAPI Gateway(HTTP API側)の入門としてHello worldを作成し、そこからEC2状態を返すように改造してみました。今回作成したAPIはお試しであるためアクセス制限はかかっていません。インタネットから普通にアクセスできるため、確認した後は速やかに削除しましょう。

最後までご覧いただき、ありがとうございました。

コメント

Top
タイトルとURLをコピーしました