前提条件
- AWS CLIがインストールされ、適切に設定されている。
- 外部DNSサービスを利用してドメインを管理している。(本記事では example.com とします)
- SSL証明書はAWS Certificate Manager(ACM)で発行済み。
AWS Lambdaのセットアップ
コードを準備
以下は、簡単なPython Lambda関数の例です。
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps('Hello, World!')
}
このコードをlambda_function.py
として保存します。
Lambda関数を作成
次のコマンドを使用して、Lambda関数を作成します。
aws lambda create-function \
--function-name MyWebApp \
--runtime python3.9 \
--role <IAM_ROLE_ARN> \
--handler lambda_function.lambda_handler \
--zip-file fileb://function.zip
--function-name
: 作成するLambda関数の名前。--runtime
: 使用するランタイム。--role
: IAMロールのARN(Lambdaが必要な権限を持つロール)。--handler
: Lambda関数のエントリーポイント。--zip-file
: 関数コードを含むZIPファイルのパス。
function.zip
には、lambda_function.py
を圧縮して作成します。
zip function.zip lambda_function.py
API Gatewayのセットアップ
API Gatewayの作成
API Gatewayを作成してLambda関数を公開します。
aws apigatewayv2 create-api \
--name MyWebAppAPI \
--protocol-type HTTP \
--target <LAMBDA_FUNCTION_ARN>
--name
: APIの名前。--protocol-type
: HTTPまたはWebSocket。--target
: 接続するLambda関数のARN。
Lambda権限の付与
API GatewayがLambda関数を実行できるように権限を付与します。
aws lambda add-permission \
--function-name MyWebApp \
--statement-id apigateway-access \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com
--statement-id
: 権限を識別する一意の名前。--action
: 実行可能なアクション。--principal
: 許可するプリンシパル。
カスタムドメインの設定
SSL証明書をAPI Gatewayに関連付け、カスタムドメインを設定します。
aws apigatewayv2 create-domain-name \
--domain-name example.com \
--domain-name-configurations CertificateArn=<ACM_CERTIFICATE_ARN>
--domain-name
: 設定するカスタムドメイン名。--domain-name-configurations
: ACM証明書のARNを指定。
APIマッピングの設定
カスタムドメインにAPIエンドポイントを関連付けます。
aws apigatewayv2 create-api-mapping \
--domain-name example.com \
--api-id <API_ID> \
--stage $default
--api-id
: 作成したAPIのID。--stage
: APIのステージ(デフォルトは$default
)。
DNS設定
外部DNSサービスでドメインを管理している場合、以下の手順でDNS設定を行います。
CNAMEレコードの追加
外部DNSサービスの管理画面で、以下のCNAMEレコードを追加します。
- 名前:
example.com
- 値: API Gatewayのカスタムドメインのエンドポイント
DNS設定が反映されるまで数分〜数時間かかることがあります。
動作確認
ブラウザでカスタムドメイン(例: https://example.com
)にアクセスし、「Hello, World!」が表示されることを確認します。