AWSIaCLinux

CloudFormationとAnsibleでEC2インスタンス構築時にOpenVPN構築してみた

AWS

以前に紹介した以下の記事で、AWS上のAmazonLinux2にOpenVPNサーバを構築しました。

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

さらに以下の記事ではAnsibleを使ってコードによるOpenVPNサーバを構築いたしました。

AnsibleでOpenVPNのインストールをコード化する
https://syachiku.net/ansible-openvpn-install/

また、さらに以下の記事ではCloudFormationのUserdataを使ってパッケージをインストールしてみました。

AWS CloudFormationでEC2にUserdataでパッケージをインストールする
https://syachiku.net/ec2-userdata/

という事で今回はそれらを組み合わせて、CloudFormationとAnsibleでEC2インスタンス構築時にOpenVPNサーバを構築してみたいと思います。

基本的には

1. 前提

  • AWS環境などはすでにある
  • GithubなどのリポジトリにAnsible Playbookが格納されている
    • 今回私はCodeCommitを利用しています。

2. 構築処理の流れ

以下のような流れで処理していきます。

3や4の部分などをcfn-initに組み込んでデバックしやすくする事も今後検討したいと思ってますが、とりあえずは動作するものを作っていきます。

  1. マネコンのCloudFormationからテンプレートをアップしてスタックを作成してEC2インスタンスを構築を開始
  2. UserDataにて必要パッケージ(gitとansible)をインストール
  3. git cloneでCodeCommitから/tmp配下にリポジトリ内容を配置
  4. 必要なファイルを/etc/ansibleにcopyする
  5. cfn-initを呼び出して、ansible-playbookを実行してOpenVPNセットアップ
  6. cfn-initによるセットアップが完了するとcfn-signalでスタック作成完了通知

3. 構築処理の流れ(図面)

図にするとこんな感じです。
gitで取得してからcopyしてますが、そのままコピーしても構成によっては大丈夫です。

4. CloudFormationテンプレート

基本的には以下の記事のテンプレートを利用しています。

AWS CloudFormationでEC2にUserdataでパッケージをインストールする
https://syachiku.net/ec2-userdata/

cfn-initの部分だけ修正しています。
適宜リポジトリ名を修正してください、またリポジトリ内のフォルダ構成に応じてCopyするファイルなども修正する必要があると思います。
一応、cfn-signalを受け取って完了となるまでのタイムアウトを15分に設定しています。

Resources:
  Ec2InstanceVPN:
    Type: AWS::EC2::Instance
    Metadata:
      Comment: install and setup openvpn by ansible-playbook
      AWS::CloudFormation::Init:
        configSets:
          InstallAndRun:
            - Install
        Install:
          commands:
            01_install_openvpn_by_ansible:
              command: "ansible-playbook /etc/ansible/site.yml"
              cwd : "/etc/ansible"
    Properties:
      IamInstanceProfile: !Ref IamInstanceProfile
      ImageId: !Ref ImageID
      KeyName: !Ref KeyPairName
      InstanceType: !Ref InstanceType
      NetworkInterfaces:
        - AssociatePublicIpAddress: True
          DeviceIndex: "0"
          SubnetId: !Ref InstanceSubnet
          GroupSet: !Ref SecurityGroupIds
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 80
      Tags:
        - { Key: Name, Value: !Sub "aws-infra-ec2-${Date}" }
        - { Key: Owner, Value: !Sub "aws-infra" }
      UserData:
        Fn::Base64:
          !Sub |
            #!/bin/bash -xe
            yum update -y

            # git clone
            yum install -y git
            export HOME=/root
            git config --global credential.helper '!aws codecommit credential-helper $@'
            git config --global credential.UseHttpPath true
            git clone -b <branch名> https://git-codecommit.xxxxxx.amazonaws.com/v1/repos/リポジトリ名 /tmp/リポジトリ名

            # install ansible and copy playbook
            amazon-linux-extras enable ansible2
            yum install -y ansible
            cp -rf /tmp/リポジトリ名/playbook/* /etc/ansible/

            # cfn-init
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --configsets InstallAndRun --resource Ec2InstanceVPN --region ${AWS::Region}

            # cfn-signal
            /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource Ec2InstanceVPN --region ${AWS::Region}

    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M

5. Ansible Playbook

こちらについては以下の記事のPlaybookと同じものをそのまま利用してリポジトリに登録しておきます。

以下の記事を参考にしてください。

AnsibleでOpenVPNのインストールをコード化する
https://syachiku.net/ansible-openvpn-install/

6. 実行してみる

マネージメントコンソール経由で作成します。CloudFormationを開きます。

「スタックの作成」→「新しいリソースを使用」を選択します。

「テンプレートファイルをアップロード」からコードのファイルを選択します。

7. 結果

10分くらいするとスタック作成が完了すると思います。

作成されたインスタンスにsshなどでログオンしてcfn-init.logを確認してみてください。
うまく言っていればOpenVPN構築のplaybookが完了となっているはずです。

8. まとめ

CloudFormationとAnsibleでEC2インスタンス構築時にOpenVPNサーバを構築してみました。

私もそうでしたが、AWS上のサーバ構築をIaCで行おうと思っても、全体的な流れについてつかみにくいですよね。

今回の記事では、手動でサーバを構築→ansibleで構築の流れ+CloudFormationでのUserDataの2つを組み合わせることで構成管理も同じリポジトリでできるようになるため運用上ではかなりのメリットになります。

是非、不明点があって足踏みしている方がいたら、参考にして頂けると嬉しいです。

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認定ソリューションアーキテクト-アソシエイト問題集

今回は以上となります。

コメント