API Gatewayの概念は理解しているつもりですが、実際に触れることがほぼなかったため、勉強の為に少し触れてみました。本記事ではAPI Gatewayの「HTTP API型」でHello worldを実施したのち、Lambda関数を少し改造して任意EC2の状態を取得できるようにしてみます。なお、本記事では認証には触れません。作成したAPIはインターネット上から叩くことが出来るため注意が必要です。
いざ、入門します。
API Gatewayについて
API Gatewayは大きく以下の種類があるようです。
- REST API
- HTTP API
HTTP APIのほうが後から登場していますが、必要最低限の機能に絞られているようです。今回はLabmda関数と簡単に連携するだけなので「HTTP API」を使っていきます。
API Gateway入門作成
最初にHello wordを試します。
では早速、公式サイトにチュートリアルに沿って「Hello world」してみます。
次の手順で進めます。
- Lambda関数を作成する。
- API Gateway(HTTP API型)を作成する。
- Hello world出来るかな。
最初に、Lambda関数を作成しますが、今回は「Python」で作成してみます。デフォルトでHello Worldが返す関数が作成されるため、スムーズです。
Lambda関数作成と同時に、本関数用のロールも合わせて作成されました。
次にAPI Gateway(HTTP API側)を作成していきます。この処理で先ほど作ったLambda関数を呼び出すようにします。
なお、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)
}
「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はお試しであるためアクセス制限はかかっていません。インタネットから普通にアクセスできるため、確認した後は速やかに削除しましょう。
最後までご覧いただき、ありがとうございました。
コメント