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

いざ、入門します。
API Gatewayについて
Amazon API Gateway は、あらゆる規模の REST、HTTP、および WebSocket API を作成、公開、維持、モニタリング、およびセキュア化するための AWS のサービスです。
API Gatewayは大きく以下の種類があるようです。
- REST API
- HTTP API
HTTP APIのほうが後から登場していますが、必要最低限の機能に絞られているようです。今回はLabmda関数と簡単に連携するだけなので「HTTP API」を使っていきます。
公式サイトに両方の差分が表ベースで記載されています。多機能なのはREST APIです。
API Gateway入門作成
最初にHello wordを試します。
では早速、公式サイトにチュートリアルに沿って「Hello world」してみます。
次の手順で進めます。
- Lambda関数を作成する。
- API Gateway(HTTP API型)を作成する。
- Hello world出来るかな。
最初に、Lambda関数を作成しますが、今回は「Python」で作成してみます。デフォルトでHello Worldが返す関数が作成されるため、スムーズです。



Lambda関数作成と同時に、本関数用のロールも合わせて作成されました。
次にAPI Gateway(HTTP API側)を作成していきます。この処理で先ほど作ったLambda関数を呼び出すようにします。


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

■ルートとは?
→ 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等)を返すように改造してみます。
次の手順で進めます。
- Lambda関数のロールにEC2アクセス用ポリシを追加する。
- Lambda関数を改造する。
- インスタンスIDを引数に状態取得が出来るかな。

次のように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はお試しであるためアクセス制限はかかっていません。インタネットから普通にアクセスできるため、確認した後は速やかに削除しましょう。

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