0Pricing
Cloud & IT Cert Prep · レッスン

認可:IAM、Lambda Authorizers、Cognito

IAM SigV4 署名、カスタム Lambda オーソライザー、Amazon Cognito User Pool オーソライザーを使って API エンドポイントを保護します。

「認可:IAM、Lambda Authorizers、Cognito」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

API の認可が重要な理由

認可制御がなければ、インターネット上のあらゆるクライアントが API Gateway のエンドポイントを呼び出し、データにアクセスしたり変更したりできてしまいます。API Gateway には、ネイティブの認可メカニズムが 3 つあります。IAM (SigV4)、Lambda オーソライザー、Amazon Cognito ユーザープールオーソライザーです。それぞれ用途が異なります。IAM は AWS サービス間の呼び出し、Lambda オーソライザーはカスタムトークンやリクエストに基づく認証、Cognito は Web やモバイルユーザーの認証に使用します。

SigV4 による IAM 認可

IAM 認可では、呼び出し元に AWS Signature Version 4 (SigV4) を使用してリクエストに署名することを要求します。呼び出し元には AWS 認証情報(アクセスキーとシークレットキー、または STS から取得した一時認証情報)が必要であり、IAM ポリシーで API の ARN に対する execute-api:Invoke が許可されていなければなりません。これは AWS 内でのマシン間(サーバー間)呼び出しに適しています。たとえば、Lambda から別の API を呼び出す場合、EC2 から内部 API を呼び出す場合、クロスアカウントでサービスにアクセスする場合などです。ブラウザクライアントで SigV4 を使用するのは容易ではありません。

# IAM policy to allow invoking a specific API endpoint
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Action': 'execute-api:Invoke',
    'Resource': 'arn:aws:execute-api:us-east-1:123456789012:abc123/prod/GET/orders'
  }]
}

Lambda オーソライザー:トークンベース

Lambda オーソライザー(以前の Custom Authoriser)は、バックエンド統合を呼び出す前に API Gateway が実行する、ユーザー作成の Lambda 関数です。トークンベースのオーソライザーでは、API Gateway が Authorization ヘッダーからトークン(JWT、OAuth、API キー)を抽出し、Lambda に渡します。Lambda はトークンを検証します(たとえば、公開鍵に対する JWT 署名の検証や、サードパーティの ID プロバイダーの呼び出しを行います)。その後、リクエストを許可または拒否する IAM ポリシードキュメントを返します。

def lambda_handler(event, context):
    token = event['authorizationToken']
    # Validate token (JWT verification, introspect OAuth, etc.)
    if is_valid_token(token):
        return {
            'principalId': 'user123',
            'policyDocument': {
                'Version': '2012-10-17',
                'Statement': [{'Effect': 'Allow', 'Action': 'execute-api:Invoke',
                                'Resource': event['methodArn']}]
            },
            'context': {'userId': 'user123', 'role': 'admin'}
        }
    raise Exception('Unauthorized')

Lambda オーソライザー:リクエストベース

リクエストベースの Lambda オーソライザーでは、API Gateway はトークンだけでなく、リクエストコンテキスト全体(ヘッダー、クエリ文字列、ステージ変数、パスパラメータ)を Lambda に渡します。これは、複数のリクエスト属性に基づいて認可する場合に便利です。たとえば、IP の許可リスト、ヘッダーの組み合わせ、多要素認証のチェックなどに使用できます。リクエストベースのオーソライザーは、REST API と HTTP API の両方でサポートされています。

Lambda オーソライザーのキャッシュ

API リクエストごとに Lambda オーソライザーを呼び出すと、遅延とコストが増加します。オーソライザー結果のキャッシュを有効にすると、オーソライザーが返した IAM ポリシーを、設定可能な TTL(0~3600 秒)の間、トークン値をキーとしてキャッシュできます。同じトークンを使用する後続のリクエストでは Lambda の呼び出しが省略され、キャッシュされたポリシーが使用されます。TTL はトークンの有効期限に合わせて設定します。トークンの有効期間が 1 時間なら、オーソライザーの結果も同じ期間キャッシュします。キャッシュは REST API で利用でき、HTTP API の JWT オーソライザーにはキャッシュ機能が組み込まれています。

Amazon Cognito ユーザープールオーソライザー

Cognito ユーザープールオーソライザーは、Lambda 関数を使わずに、Cognito が発行した JWTを API Gateway 内で直接検証します。ユーザーが Cognito(Hosted UI、SDK、またはフェデレーション ID プロバイダー経由)で認証されると、Cognito は ID トークンまたはアクセストークンを発行します。クライアントはこのトークンを Authorization ヘッダーに含めます。API Gateway は、Cognito ユーザープールに基づいてトークンの署名と有効期限を検証します。トークンが有効ならリクエストは処理され、無効なら API Gateway は 401 を返します。

aws apigateway create-authorizer \
  --rest-api-id 'abc123' \
  --name 'CognitoAuthorizer' \
  --type COGNITO_USER_POOLS \
  --provider-arns 'arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_XXXXXXX' \
  --identity-source 'method.request.header.Authorization'

HTTP API の JWT オーソライザー

HTTP API では、Lambda を使わないネイティブの JWT オーソライザーを利用できます。JWT の発行者 URL(Cognito、Auth0、Okta など)とオーディエンスを指定すると、API Gateway が JWT を自動的に検証します。これは基本的に Cognito ユーザープールオーソライザーと同じですが、標準に準拠した OIDC プロバイダーであればどれでも利用できます。トークンの検証(署名、有効期限、オーディエンス)は API Gateway 内部で行われるため、Lambda オーソライザーより低遅延で、Lambda のコストもかかりません。

aws apigatewayv2 create-authorizer \
  --api-id 'abc123' \
  --authorizer-type JWT \
  --name 'JWTAuthorizer' \
  --identity-source '$request.header.Authorization' \
  --jwt-configuration '{
    "Issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_XXXXXXX",
    "Audience": ["your-client-id"]
  }'

Cognito Identity Pools と User Pools の違い

API の認可には Cognito User Pools を使用します。User Pools はユーザー認証を管理し、JWT を発行します。一方、Cognito Identity Pools(フェデレーティッドアイデンティティ)は別の機能で、サードパーティのトークン(User Pools、ソーシャルログイン、SAML から取得したもの)を一時的な AWS 認証情報(STS の AssumeRoleWithWebIdentity 経由)に交換します。Identity Pools は、アプリがクライアントから AWS サービス(S3、DynamoDB)に直接アクセスする必要がある場合に使用します。API Gateway の認証には User Pool の JWT が適しており、Identity Pool の認証情報はブラウザやモバイルから AWS SDK を直接呼び出すためのものです。

API Gateway のリソースポリシー

REST API はリソースポリシーをサポートしています。これは API にアタッチする JSON ポリシーで、IP アドレス、VPC エンドポイント、送信元アカウント、ARN に基づいてアクセスを制御します。リソースポリシーを使用すると、特定の IP 範囲からの API 呼び出しだけを許可したり、特定の VPC エンドポイント(プライベート API)経由のリクエストにアクセスを制限したり、クロスアカウントの呼び出しを許可したりできます。リソースポリシーはメソッドレベルのオーソライザーと併用されます。リクエストを成功させるには、両方で許可されている必要があります。

# Allow only specific IP range to call the API
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Principal': '*',
    'Action': 'execute-api:Invoke',
    'Resource': 'arn:aws:execute-api:us-east-1:123456789012:abc123/*',
    'Condition': {'IpAddress': {'aws:SourceIp': '203.0.113.0/24'}}
  }]
}

相互 TLS 認証

相互 TLS (mTLS) では、TLS ハンドシェイク中にクライアントとサーバーの両方が証明書を提示する必要があります。API Gateway は、カスタムドメイン名が設定されている場合、REST API と HTTP API の mTLS をサポートします。クライアントは、S3 のトラストストアにアップロードした認証局(CA)が署名した有効な証明書を提示する必要があります。mTLS は、トークンベースの認証だけでは不十分で、強力なクライアント ID 検証が必要な金融サービス、IoT デバイス認証、B2B 統合などで使用されます。

適切なオーソライザータイプの選択

SAA-C03 試験におけるオーソライザーの選択:IAM (SigV4) → 同一アカウントまたはクロスアカウントでの AWS サービス間の呼び出し。Cognito User Pool → Cognito で認証された Web やモバイルアプリのユーザー。Lambda オーソライザー → カスタム認証ロジック(サードパーティの ID プロバイダー、レガシーなトークン形式、OAuth のイントロスペクション、IP とトークンの組み合わせなど)。JWT オーソライザー (HTTP API) → 標準に準拠した任意のプロバイダーが発行する OIDC/OAuth2 トークンを、Lambda オーソライザーより低コストで検証する場合。オーソライザーなし → パブリック API。

理解度チェック

このレッスンで学んだ AWS Solutions Architect (SAA-C03) の概念について理解度を確認します。

レッスンのまとめ

このレッスンでは、次のことを学びました。IAM (SigV4) 認可は、AWS 認証情報を使用したサービス間の呼び出しに適しています。Cognito User Pool オーソライザーは、Cognito が発行した JWT をネイティブに検証し、Web やモバイルアプリを保護します。Lambda オーソライザーは、サードパーティの ID プロバイダー向けのカスタムトークン検証や、複雑な認可ロジックを実装でき、結果のキャッシュも任意で利用できます。次は、API Gateway のスロットリング、キャッシュ、使用量プランについて学びます。

よくある質問

「認可:IAM、Lambda Authorizers、Cognito」レッスンは無料ですか?

はい。「認可:IAM、Lambda Authorizers、Cognito」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

「認可:IAM、Lambda Authorizers、Cognito」で何を学びますか?

IAM SigV4 署名、カスタム Lambda オーソライザー、Amazon Cognito User Pool オーソライザーを使って API エンドポイントを保護します。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cloud & IT Cert Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「認可:IAM、Lambda Authorizers、Cognito」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?

はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. REST API、HTTP API、WebSocket API
  2. 統合:Lambda、HTTP、Mock
  3. 認可:IAM、Lambda Authorizers、Cognito
  4. スロットリング、キャッシュ、使用量プラン
← Cloud & IT Cert Prepに戻る