未来は僕以外の手の中

SI屋がIT技術やビジネスのことなどを気ままに書き綴ってみるなど

CloudFormationでインドVPN用EC2構築してみた(Youtube Premium格安利用を目指して)

Youtube中毒な日々を送っているのでPremiumに登録済なのだが、巷で話題のインドVPN経由で格安でPremium利用する方法を知りつつずっと手をつけていなかった。

ramune-channel.com

そろそろ重い腰を上げてやってみようと思い、せっかくならインドVPNAWSで構築することにした。

構築方針

AWSのムンバイリージョンにEC2を構築しSoftEther VPNを導入する。

IaC(Infrastructure as Code)を今後学んでいかねばと考えており、今回

  • Pulumi:現場で導入中。未経験なのでキャッチアップしてきたい
  • CloudFormation:現場で使われている。若干かじっている。

のどちらにするか迷ったが、早く格安Premiumにしたかったので多少わかるCloudFormationを採用することにした。Pulumiはまた次回触ってみよう。

また、せっかくなのでCloudFormationデザイナーを使ってみることにした(こちらは未経験)。

AWSインドVPN構築

最終的な構成イメージ

EC2接続のSession Manager用にIAMRole、InstanceProfileも作成しているが、
EC2 Instance Connectだけで事足りたので実はいらなかった。。詳細は後述

CloudFormationデザイナーでテンプレート作成

IAMRole/InstanceProfileを除いた基本形の
 EC2インスタンス構築(VPC、Subnet、IGW、RouteTable込み)
は下記の記事がわかりやすく、基本踏襲させてもらった。


ここまでで構築したリソースは下記となる

  • VPC
  • Subnet
  • EIP
  • InternetGateway
  • RouteTable
  • SecurityGroup
  • EC2

参考記事との差分だけ記述しておく

SecurityGroup
鍵管理が不要なEC2 Instance Connectでの接続を想定し、

  • タイプ:SSH
  • ソース:13.233.177.0/29

を設定する。
このソースIPはムンバイリージョンでEC2 Instance Connectを使う場合のIPレンジとなる。(2021/05/16現在)
このIPレンジはAWS社が公開しているこちらから確認可能。

SoftEther VPNを利用するにあたってのUDPポートも設定しておく。

  SGVPNEC2:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      VpcId: !Ref VPCVPN
      GroupDescription: ssh login
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 13.233.177.0/29
        - IpProtocol: udp
          FromPort: 4500
          ToPort: 4500
          CidrIp: 0.0.0.0/0
        - IpProtocol: udp
          FromPort: 500
          ToPort: 500
          CidrIp: 0.0.0.0/0

EC2インスタンス

EC2 Instance Connectは下記Linux ディストリビューションがサポートされている。

ということで、

  • Amazon Linux 2 AMI (HVM) ami-010aff33ed5991201 (64 ビット x86)
  • 無料枠のあるt2.micro

を使うことにした。

  EC2YoutubeVPN:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: ami-010aff33ed5991201
      InstanceType: t2.micro
      SubnetId: !Ref SubnetPublic
      SecurityGroupIds:
        - !Ref SGVPNEC2

実は当初はArmでやってみようと「64 ビット Arm、t4g.micro」で作ったが、SoftEher導入のmake時にエラーが発生。
下記記事にて類件対処方法もあるが、他にもエラーが出て解決に時間がかかりそうだったので無理せず諦めた。
[softeher] ARM系のCPUのSoC搭載SBCで、ソースからsofteherをビルド – ぷすぅ~ぷすぅ~

スタック作成

ここまでの構築でスタックを流し、無事に「CREATE_COMPLETE」となる
EC2 Instance ConnectでのEC2接続も確認できた。

EC2 Instance Connectではローカル端末からのコピペができないと思っていた(そのような記事があった)ので、SessionManagerでの接続もできるように対応した。
事後でローカル端末のコピーを普通にCtrl+VでEC2 Instance Connectでペーストできることがわかった。。

(オプション)Session Manager接続設定

今回の要件ではEC2 Instance Connectで十分であったが、せっかくなのでSession Managerの設定も記録しておく。
IAM関連だとCloudFormationデザイナーの記事はさくっとは見つからなかったので、通常の下記CloudFormation記事を参考にさせてもらうことにした。

Session ManagerはAmazon Linux2ではデフォルトで導入済なので、あとは適切なポリシーを付与してあげるのみ。
IAMポリシーのAmazonSSMManagedInstanceCoreがアタッチされているIAMロールをEC2に付与してあげる必要があるとのことで、下記のように記述

  IAMInsProfile:
    Type: 'AWS::IAM::InstanceProfile'
    Properties:
      Roles:
        - !Ref IAMRole
  IAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore'

これでスタック更新を行い、さっそくSession Managerで接続しようとするが、、

あれ、まだ接続できない。

【初心者向け】Session Manager でインスタンスが表示されない時のトラブルシュート | DevelopersIO
Session Manager初心者なので上記を見ると、再起動するとSSM側に認識されやすくなるとの記載あり。

IAMロールをつけ忘れていた場合に、IAMロールをアタッチしてもすぐにSSMコンソールで表示されないことがあります。早く確認したいときは、インスタンスを再起動すると、SSM側に認識されやすくなることがあります。

ということでさっそくEC2再起動したら無事にいけた!

SoftEther VPNインストール&VPN利用確認

下記記事が詳しいのでこれに従い導入を行った。ここでは割愛。
hacknote.jp

(後日談) SoftEather VPNのDocker版が存在。こっちのほうがスムーズに導入可。
blog.odaryo.com


Macから無事にVPN接続できたので、グローバルIPがEIP (ムンバイリージョン)になっているかここから確認したところ、きちんと変わっていることを確認

YoutubeのPremiumプラン変更

まずはこれまで契約していたPremium(Apple経由)サブスクを解除。YoutubeロゴもIN (インド)に変わっていることを確認、Premium料金もルピー表記になっている!早速ファミリープランで申し込み実施。
注:既存Premium解約して数時間してからやっとPremium再契約可能な画面が出るようになった。

CloudFormationデザイナー所感

テンプレートを可視化した上で、リソースの関連付けも直感的にできるのはわかりやすい。一方で、位置情報などのメタデータが入ってしまうのでそれによるテンプレート肥大化はネックかな。

CloudFormationデザイナーをまとめてくれているスライドがあり、そこでもやはりメタデータのことが書かれている。

www.slideshare.net

CloudFormationデザイナーで、コードを編集するのはやめておいた方がいいです。メタデータが付くため、バージョン管理するときに差異がわかりづらくなります。
(中略)
コードの編集は、テキストエディタを使って図を見たいときにCloudFomationデザイナーを使うのがいいです。
【AWS CloudFormation入門】 初心者が気をつけたいこと5つ|スクショはつらいよ

一時的にサクッと環境作って破棄するならCloudFormationデザイナーでの作成・編集も有用だが、本格的に環境構築・改修を行うようなケースでは上記のように図を見るときだけデザイナー使うのがよいのかもしれない。