AWSIaC

AWSのCloudFormationでIaCを実践(8) – Route53 Resolver

AWS

前回はRoute53 PrivateHostedZoneを作成してレコードを登録しました。

前回(第7回) – Route53 HostedZone 
https://syachiku.net/awscloudformationiac6-trail/

最終的にVPC内のインスタンスであれば名前解決できましたが、VPC外部(VPNなどで接続した自宅PCなど)では名前解決ができずに失敗しました。

そこで、今回はその対応として「R53リゾルバー」をCloudFormationで構築し、VPC外部であるVPN経由でも正しく名前解決ができることを確認します。

ちなみにVPNサーバは以下の記事で構築しています。

AWS上のEC2でOpenVPNサーバを構築する
https://syachiku.net/ec2openvpn-1/

※今回実施する内容は少額ですが利用料金が発生します。あくまで自己責任でお願いします。

AWSのCloudFormationでIaCを実践してみる(すべての記事一覧)
第1回 – VPC  https://syachiku.net/awscloudformationiac1-vpc/
第2回 – Role  https://syachiku.net/awscloudformationiac2-iam-role/
第3回 – SecurityGroup  https://syachiku.net/awscloudformationiac3-sg/
第4回 – EC2  https://syachiku.net/awscloudformationiac4-ec2/
第5回 – VPC FlowLogs https://syachiku.net/awscloudformationiac5-flowlogs/
第6回 – CloudTrail https://syachiku.net/awscloudformationiac6-trail/
第7回 – R53 HostedZone https://syachiku.net/awscloudformationiac7-r53-hosted/

1. 前提条件

  • AWSアカウントが取得できていること
  • 適切な権限(=Admin相当)をもったIAMユーザーを作成していること
  • ルーティングなどの最低限のネットワークの知識があること
  • YAMLの書きかたを知っていること(CloudFormationはjsonもしくはyamlで書けますが、今回はyamlで書いていきます。)

2. 今回作成するAWS環境

  • Route 53 Resolver
    • AmazonVPCとオンプレ間の名前解決を簡単にしてくれるサービスです。
    • 構成するために最低2つのNetworkInterfaceが必要です。
    • 今回はPrivateSubnetの2つのAZに対して「インバウンドエンドポイント」を構築します
  • セキュリティグループ
    • 作成する「インバウンドエンドポイント」ようにセキュリティグループも作成します
    • TCP/UDPの53番ポートへのインバウンドアクセスをVPN接続時に割り当てられるNetworkである192.168.10.0/24に対して許可します。
    • VPNサーバに割り当てているセキュリティグループで10.1.0.0/16へのport53アクセスがない場合には追加しておいてください。
  • 追加設定
    • VPNサーバで割り当てている Push DNSを作成後の「インバウンドエンドポイント」に変更します。

3. 構成図

以下のような感じとなります。

R53 ResolverとSecurityGroupのところをCloudFormatinoスタックで構築します。

4. CloudFormation Template

こちらになります。

AWSTemplateFormatVersion: '2010-09-09'
Description:
  route53 resolver

Parameters:
  ProjectName:
    Type: String
    Default: "aws-infra"
  VpcID:
    Type: String
    Default: vpc-xxxx
  VpnCidrIp:
    Type: String
    Default: 192.168.10.0/24
  SubnetId01:
    Type: String
    Default: subnet-xxxx
  SubnetId02:
    Type: String
    Default: subnet-xxxx

Resources:
  ResolverEndpointSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Sub "${ProjectName}-resolver-endpoint-sg"
      GroupDescription: Security group for resolver endpoint.
      SecurityGroupIngress:
        - CidrIp: !Ref VpnCidrIp
          FromPort: 53
          ToPort: 53
          IpProtocol: tcp
        - CidrIp: !Ref VpnCidrIp
          FromPort: 53
          ToPort: 53
          IpProtocol: udp
      SecurityGroupEgress:
        - IpProtocol: '-1'
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: !Sub "${ProjectName}-resolver-endpoint-sg"
      VpcId: !Ref VpcID

  ResolverEndpoint:
    Type: AWS::Route53Resolver::ResolverEndpoint
    Properties:
      Direction: INBOUND # VPN->AWSへの問い合わせ
      IpAddresses:
        - SubnetId: !Ref SubnetId01
        - SubnetId: !Ref SubnetId02
      Name: !Sub "${ProjectName}-esolver-endpoint"
      SecurityGroupIds:
        - !Ref ResolverEndpointSG

5. スタックの作成

それでは先ほど作成したコードを使って、リソースを作成していきます。

マネージメントコンソールにログオンしてCloudFormationを開きます。
「スタックの作成」→「新しいリソースを使用」を選択します。「テンプレートファイルをアップロード」からコードのファイルを選択してアップします。

スタックの名称やパラメータを入力(デフォルトから変更したい場合には変更してください)してスタックの作成まで進めます。

6. 作成されたリソースの確認

しばらくするとステータスが「CREATE_COMPLETE」となりスタック作成が完了します。

それでは作成されたリソースを確認してみます。

6.1. Route53 Resolver

想定した通りに構築できています。

6.2. SecurityGroup

7. VPNのPush DNSサーバの変更

インバウンドエンドポイントに割り当てられたIPアドレスをDNSサーバとして参照するようにVPNの構成を変更します。

もし、継続して利用するならばEIPを使って固定した方が良いですね。

# vi /etc/openvpn/server.conf
push "dhcp-option DNS 10.1.100.4"
push "dhcp-option DNS 10.1.200.144"

# systemctl restart openvpn@server

設定が終わったら、再度、自宅PCからVPN接続します。

8. 動作確認

それでは自宅から名前解決ができることを確認したいと思います。
問題なく名前解決ができています。

PS C:\Users\user> ping vpn.aws-infra.local

vpn.aws-infra.local [10.1.10.160]に ping を送信しています 32 バイトのデータ:
10.1.10.160 からの応答: バイト数 =32 時間 =291ms TTL=255
10.1.10.160 からの応答: バイト数 =32 時間 =129ms TTL=255

これで自宅や会社などからVPN接続した状態でもAWS内のPrivateZoneの名前解決ができるようになりました。

9. まとめ

「R53リゾルバー」をCloudFormationで構築して、想定した通り自宅や会社などからVPN接続した状態でもAWS内のPrivateZoneの名前解決ができるようになりました。

AWSを効率的に学習する方法

私が効率的にAWSを学習するために実施した方法は以下の通りです。
 ①最初に書籍(ハンズオンができる)を購入、座学でAWSの基礎を学習
 ②AWS資格試験を取得ための学習

※私の場合は①と②を合わせて2か月でソリューションアーキテクトを取得できました。

①AWS基礎学習

最初に購入した書籍は「Amazon Web Services 基礎からのネットワーク&サーバー構築」です。

Amazon Web Services 基礎からのネットワーク&サーバー構築

この本では、AWSの基本サービスを利用したハンズオンを通じて、AWSの基礎を学習することができます。

また、タイトル通りAWSのネットワークやインフラに関しても網羅しているため、もともとインフラ系の技術者ではない人たちにとっても分かりやすい内容だと思います。

とりあえずAWS上にサーバーを設定して開発を行うための準備までするには最良の一冊です。

Amazon Web Services 基礎からのネットワーク&サーバー構築

②AWS資格取得

AWSの基礎をある程度学習することができたら、次はAWS資格を取得しましょう。まずはAWSソリューションアーキテクトを目指しましょう。

資格勉強のための問題集をひたすら解きながら、AWSの知識を積み重ねて習得していきましょう!

苦行ではありますがこの問題集を3周ほどすればAWS用語や構成に関しても習得できているはずです。

AWS認定ソリューションアーキテクト-アソシエイト問題集

今回は以上となります。

コメント

タイトルとURLをコピーしました