1. ホーム
  2. 記事一覧
  3. AWS API Gateway入門 TerraformとPythonを使った簡単なハンズオン

2023.11.28

AWS API Gateway入門 TerraformとPythonを使った簡単なハンズオン

記事の目的と対象読者

AWS APIゲートウェイは、AWSクラウドでAPIを構築およびデプロイするためのサービスです。本記事では、APIゲートウェイの基本概念とその利用方法を、初心者でもわかりやすく説明します。特に、Terraformを使用したインフラストラクチャーのコード化やPythonを用いたAPIの実装方法に焦点を当てます。

この記事は、AWSやAPIゲートウェイに関する基本的な知識があまりないエンジニア初心者の方、またはこれからAPIゲートウェイを使ってみたいと考えている開発者を対象としています。簡単なハンズオンを通じて、実際にAPIゲートウェイを使ったアプリケーションの開発プロセスを学ぶことができます。

AWS APIゲートウェイとは何か?

APIゲートウェイは一言で言うとAPIの入口と出口を管理するサービスです。開発者がAPIを簡単に作成・公開・保守・管理・監視できるようにするフルマネージドサービスです。開発者はバックエンドサービスへのトラフィック管理・認証・アクセス制御・モニタリングなどを簡単に行うことができます。

引用元API Gateway のアーキテクチャ

基本概念の紹介

APIエンドポイント

APIのエンドポイントは、外部のユーザーやシステムがAPIにアクセスするためのURLです。AWS APIゲートウェイでは、これらのエンドポイントを作成し、管理することができます。

リソースとメソッド

APIゲートウェイ内で、リソースはAPIの特定の部分(例えば、ユーザー情報や商品データなど)を指します。各リソースには、HTTPメソッド(GET、POST、PUT、DELETEなど)が関連付けられており、特定の操作を行うことができます。

統合タイプ

AWS APIゲートウェイでは、バックエンドサービス(例えば、Lambda関数、HTTPベースのバックエンドなど)へのリクエストの処理方法を定義するために、様々な統合タイプを提供しています。

APIゲートウェイの利点

スケーラビリティ

AWS APIゲートウェイは自動的にスケーリングし、大量のトラフィックを処理する能力を備えています。

セキュリティ

AWSの強力なセキュリティ機能を利用して、APIを保護することができます。これには、APIキー、IAMロール、Cognitoユーザープールなどの認証メカニズムが含まれます。

モニタリングとログ

AWS CloudWatchと統合することで、APIの使用状況、パフォーマンスメトリクス、ログデータを簡単に監視し分析することができます。

柔軟なデプロイオプション

ステージング環境やバージョン管理など、開発とデプロイメントのプロセスを効率的に管理できます。

TerraformによるAWS環境のセットアップ

このセクションでは、Terraformを使用してAWS APIゲートウェイとその関連リソースをセットアップする方法について説明します。Terraformは、インフラストラクチャーをコードとして管理するためのオープンソースツールです。インフラの設定を自動化し、一貫性と再現性を向上させることができます。

IaCについてはこちらで解説しています。

https://envader.plus/article/136

Terraformの基本

インフラストラクチャー・アズ・コード

Terraformを使用することで、インフラストラクチャーの設定をコードとして記述し、管理することができます。手動での環境設定の誤りを減らし、より効率的な開発プロセスを実現します。

Terraformやそのセットアップについてはこちらの記事で解説しています。

https://envader.plus/article/162

APIゲートウェイ用のリソースをTerraformで構築

リソースの定義

APIゲートウェイを構築するために必要なリソース(例えば、REST API、リソース、メソッドなど)をTerraformファイルに定義します。

デプロイメントプロセス

Terraformを使用してリソースを定義した後、terraform apply コマンドを実行することで、AWSに対してこれらのリソースをデプロイします。

Pythonを使ったAPIの作成とデプロイ

ここでは、Pythonを使用してAPIのバックエンドロジックを作成し、AWS APIゲートウェイと統合する方法を説明します。Pythonは、柔軟性と簡潔な構文のため、APIの開発に広く使用されています。

PythonでのAPIロジックの記述

APIロジックの基本

PythonでAPIのバックエンドロジックを作成するには、通常、FlaskやDjangoなどのウェブフレームワークを使用します。これらのフレームワークを使用すると、リクエストを受け取り、適切なレスポンスを返すエンドポイントを簡単に設定できます。

例えば、GETメソッドの場合は、以下のコードでリソースの情報を取得するエンドポイントを作成できます。

from flask import request

def get_resource(name):
    # リソースの情報取得
    resource = get_resource_by_name(name)

    # レスポンスを返す
    return jsonify(resource)

@app.route("/resources/<name>", methods=["GET"])
def get_resource_endpoint(name):
    return get_resource(name)

このコードでは、get_resource()関数でリソースの情報を取得し、jsonify()関数でJSON形式のレスポンスを返しています。

開発環境の準備

Python開発環境をセットアップし、必要なライブラリ(例えば flask または django)をインストールします。

具体的には、以下の手順を実行します。

  1. Pythonをインストールします。
  2. 仮想環境を作成します。
  3. 必要なライブラリをインストールします。

APIゲートウェイとの統合

Lambda関数の作成

APIロジックをAWS Lambda関数としてデプロイします。これによりAPIゲートウェイからのリクエストを処理できるようになります。

例えば、以下のコードで、上記のget_resource()関数をLambda関数としてデプロイできます。

import json

def get_resource(event, context):
    name = event["name"]
    resource = get_resource_by_name(name)
    return {"resource": resource}

lambda_handler = get_resource

このコードでは、eventオブジェクトにリクエストの情報が、contextオブジェクトにコンテキスト情報が含まれています。get_resource()関数でリソースの情報を取得し、return文でJSON形式のレスポンスを返しています。

APIゲートウェイとの統合

AWS APIゲートウェイを設定して、特定のエンドポイントをLambda関数に統合します。APIゲートウェイがリクエストを受け取った際に、それをLambda関数に転送し、処理させることができます。

具体的には、以下の手順を実行します。

  1. APIゲートウェイの定義ファイルを作成します。
  2. 定義ファイルで、Lambda関数を統合するエンドポイントを定義します。
  3. APIゲートウェイをデプロイします。

デプロイとテスト

デプロイプロセス

作成したLambda関数をAWSにデプロイし、APIゲートウェイと統合します。これには、AWS管理コンソールまたはAWS CLIを使用することができます。

APIのテスト

APIゲートウェイを通じてエンドポイントにリクエストを送信し、期待されるレスポンスが返ってくるかどうかをテストします。これには、Postmanやcurlなどのツールを使用できます。

セキュリティとベストプラクティス

AWS APIゲートウェイを使用する際、セキュリティは極めて重要です。このセクションでは、APIゲートウェイのセキュリティ強化と、最適な運用方法について説明します。

認証と認可

APIキー

APIキーは、APIの使用を制御し、非公開のAPIにアクセスするためのシンプルな方法です。APIキーを使用することで、特定のユーザーまたはサービスがAPIを使用できるように制限します。

IAMロールとポリシー

AWSのIAM(Identity and Access Management)を使用して、APIへのアクセスを管理することができます。特定のユーザーやサービスに対して、細かいアクセス権を設定することができます。

Cognitoユーザープール

AWS Cognitoはユーザー認証と認可を管理するサービスで、APIへのアクセスをセキュアに制御するために使用されます。

APIのセキュリティ対策

リクエストの検証

APIゲートウェイはリクエストの検証を行い、不正なリクエストや攻撃を防ぐことができます。これには、リクエストの形式やサイズの検証が含まれます。

クロスオリジンリソース共有(CORS)

CORSは、ウェブページが異なるオリジンのリソースにアクセスする際のセキュリティを提供します。APIゲートウェイでCORSを適切に設定することが重要です。

パフォーマンスとコストの最適化

キャッシング

APIゲートウェイのレスポンスキャッシングを使用すると、バックエンドシステムへの負荷を減らし、レスポンス時間を短縮できます。

スロットリング

APIの使用率を制御するために、リクエストレートの制限(スロットリング)を設定することができます。過度のトラフィックによるシステムの過負荷を防ぐことができます。

実際の例をハンズオンで学ぶ

このハンズオンでは、PythonとTerraformを使用して、シンプルなHTTP APIをAWS APIゲートウェイで作成し、Lambda関数を統合するプロセスを実演します。

1. TerraformでAPIゲートウェイのセットアップ

Terraform設定ファイル (api_gateway.tf)

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_api_gateway_rest_api" "MyDemoAPI" {
  name        = "MyDemoAPI"
  description = "This is my API for demonstration purposes"
}

resource "aws_api_gateway_resource" "MyDemoResource" {
  rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id
  parent_id   = aws_api_gateway_rest_api.MyDemoAPI.root_resource_id
  path_part   = "mydemo"
}

resource "aws_api_gateway_method" "MyDemoMethod" {
  rest_api_id   = aws_api_gateway_rest_api.MyDemoAPI.id
  resource_id   = aws_api_gateway_resource.MyDemoResource.id
  http_method   = "GET"
  authorization = "NONE"
}

resource "aws_api_gateway_integration" "LambdaIntegration" {
  rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id
  resource_id = aws_api_gateway_resource.MyDemoResource.id
  http_method = aws_api_gateway_method.MyDemoMethod.http_method

  integration_http_method = "POST"
  type                    = "AWS_PROXY"
  uri                     = aws_lambda_function.MyDemoLambda.invoke_arn
}

lambda.tf

Iamロール・ポリシーも指定していますが、適切なものに書き換えてください。

data "archive_file" "sample_function" {
  type        = "zip"
  source_dir  = "lambda/sample_function" # Lambda関数のコードが含まれるディレクトリ
  output_path = "lambda/upload/sample_function.zip" # 出力されるZIPファイルのパス
}

resource "aws_lambda_function" "MyDemoLambda" {
  function_name = "MyDemoLambda"
  handler       = "lambda_function.lambda_handler" # Pythonファイルと関数名を指定
  runtime       = "python3.10" # ランタイムを指定

  # Lambda関数のコードを含むZIPファイルのパスを指定
  filename      = data.archive_file.sample_function.output_path # ZIPファイルのパス

  # Lambda関数に必要なIAMロールのARNを指定
  role          = aws_iam_role.lambda_exec.arn
}

resource "aws_iam_role" "lambda_exec" {
  name = "lambda_exec_role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Action = "sts:AssumeRole",
        Effect = "Allow",
        Principal = {
          Service = "lambda.amazonaws.com"
        },
      },
    ],
  })
}

# 必要に応じて、IAMポリシーを追加してLambda関数の権限を拡張
resource "aws_iam_role_policy" "lambda_policy" {
  name = "lambda_policy"
  role = aws_iam_role.lambda_exec.id

  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Action = [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
        ],
        Effect = "Allow",
        Resource = "arn:aws:logs:*:*:*"
      },
    ],
  })
}

2. PythonでLambda関数の作成

lambda/sample_function配下にlambda_function.pyファイルを作成してください。

Lambda関数 (lambda_function.py)

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

3. デプロイとテスト

  1. Terraformを使用してAPIゲートウェイとLambda関数をデプロイします。

    terraform init
    terraform apply
  2. Postmanやcurlを使用して、作成したAPIエンドポイントにリクエストを送信し、レスポンスを確認します。

    curl https://<api-id>.execute-api.<region>.amazonaws.com/mydemo

まとめ

この記事では、AWS APIゲートウェイの基本から、ハンズオンまでを一通り学びました。

学んだことの要約は、次のとおりです。

  • AWS APIゲートウェイの基本概念とその利点
  • Terraformを使用してインフラストラクチャをコード化する方法
  • Pythonを用いてAPIのバックエンドロジックを実装する方法
  • APIゲートウェイのセキュリティ対策とベストプラクティス
  • ハンズオンを通じたAPIの作成とデプロイ

API開発はエンジニアへの第一歩となりますので、ハンズオンで学んだことを活かし自分オリジナルのAPIを作成してみましょう。

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事