AWS Gatewayでカスタムドメインを利用する方法

API Gatewayでカスタムドメインを利用する方法を学習したので、今後の業務などで実際に行う時などの為にメモ代わりに記事に残しておきたいと思います。

## カスタムドメインを利用する上での注意点

カスタムドメインを利用する場合**route53**と**Certificate Manager**で登録されたドメインとSSL/TLS 証明書が必要な為料金が発生する可能性が存在します。
私は、学習の為の必要経費だと思い気にしませんが注意が必要だと思います。

## テンプレートの作成

今回、**CloudFormation**を利用して行いました。
その為テンプレートを作成する処から始めたいと思います。
本当は**route53**もテンプレート化したい所ですが、今回はコンソールで登録作業を完了している状態を想定してあります。

作成するテンプレートの構成は以下になります。

1. IAM ロールの作成
1. WebSecurityGroupの作成
1. CertificateManagerでのSSL/TLS 証明書の作成
1. API GatewayでのREST APIの作成(カスタムドメインのマッピング含む)
1. AWS Lambdaの作成(API Gateway、WebSecurityGroup、VPC,Layerの紐付け含む)
1. Layerの作成

実際のテンプレート中身は以下です。

```templete.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: sample API
Globals:
  Api:
    OpenApiVersion: 3.0.2
Resources:
# IAM ロールの作成
  LambdaExecutionRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: "sts:AssumeRole"
      ManagedPolicyArns:
        - !Sub 'arn:aws:iam::aws:policy/AmazonVPCFullAccess'
# WebSecurityGroupの作成  
  WebSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: "sample API SecurityGroup"
      GroupName: sample-API-SecurityGroup
      VpcId: vpc-XXXXXXXX
# CertificateManagerでのSSL/TLS 証明書の作成
  Certificate:
    Type: AWS::CertificateManager::Certificate
    Properties:
      DomainName: "example.com" # カスタムドメインとして設定したいroute53で設定してあるドメイン
      DomainValidationOptions:
        - DomainName: "example.com"  # カスタムドメインとして設定したいroute53で設定してあるドメイン
          HostedZoneId: "xxxxxxxxxx" # カスタムドメインとして設定したいroute53で設定してあるドメインのホストゾーンID
      ValidationMethod: DNS
# API GatewayでのREST APIの作成(カスタムドメインのマッピング含む)
  RestApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: dev
      OpenApiVersion: 3.0.2
      Domain:
        DomainName:  "example.com" # カスタムドメインとして設定したいroute53で設定してあるドメイン
        CertificateArn: !Ref Certificate # Certificateを紐付け
        EndpointConfiguration: REGIONAL
        Route53:
          HostedZoneId: "xxxxxxxxxx" # カスタムドメインとして設定したいroute53で設定してあるドメインのホストゾーンID
        BasePath:
          - /
      EndpointConfiguration: REGIONAL
      DefinitionBody:
        Fn::Transform:
          Name: AWS::Include
          Parameters:
            Location: ./sample-api-dev-swagger-apigateway.yaml # API　Gatewayの構成のパス
# AWS Lambdaの作成(API Gateway、WebSecurityGroup、VPC,Layerの紐付け含む)
  SampleFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: sample-function
      Handler: lambda_function.lambda_handler
      Runtime: python3.8
      Role: !GetAtt LambdaExecutionRole.Arn # Roleを紐付け
      CodeUri: ./sample-function/ # Lambdaのコードのパス
      Description: ''
      MemorySize: 128
      Timeout: 25
      Events:
        Api:
          Type: Api
          Properties:
            RestApiId: !Ref RestApi # RestApiと紐付け
            Path: '/v1/sample-function/{param}'
            Method: GET
      VpcConfig:
        SecurityGroupIds:
          - !Ref WebSecurityGroup # WebSecurityGroupと紐付け
        SubnetIds:
          - subnet-XXXXXXXX
          - subnet-XXXXXXXX
      Environment:
        Variables:
          ID: 1234 # 環境変数その１
          PASS: hogehoge # 環境変数その2
      Tags:
        STAGE: dev
      Layers:
      - Ref: SampleLayers # Layersと紐付け
# Layerの作成  
  SampleLayers:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: sample-layers
      Description: Sample API Resource Layer
      CompatibleRuntimes: 
      - python3.8
      ContentUri: ./sample-layers # Layersのパス
```

後は、MakeFileを使用するか直接コマンドを入力してデプロイを行えば完了です。
デプロイの方法に関しては、弊社グループの@shimajiriや私が以前投稿した以下の記事を参考にしてください。

https://qiita.com/shimajiri/items/e22b18188051c2199582

https://qiita.com/lberc_yuki_ono/items/2a2d6f0cf7982bf3fbfb