以前に紹介した以下の記事で、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に組み込んでデバックしやすくする事も今後検討したいと思ってますが、とりあえずは動作するものを作っていきます。
- マネコンのCloudFormationからテンプレートをアップしてスタックを作成してEC2インスタンスを構築を開始
- UserDataにて必要パッケージ(gitとansible)をインストール
- git cloneでCodeCommitから/tmp配下にリポジトリ内容を配置
- 必要なファイルを/etc/ansibleにcopyする
- cfn-initを呼び出して、ansible-playbookを実行してOpenVPNセットアップ
- 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を学習するために使った学習材料は「Udemy」だけです。
まずは座学を行ってAWSプラクティショナー もしくは ソリューションアーキテクト試験を取得することを目標にしました。
具体的にはUdemyで以下の2つの商材を購入して学習しました。AWS公式が提供している模擬試験も受けていません。
Udemyは世界最大級のオンライン学習プラットフォームで、世界中の学びたい人と教えたい人をオンラインでつなぐサービスです。 Udemyは米国Udemy,Inc.が運営するプラットフォームで日本ではベネッセが事業パートナーとして協業をしています。 C2C(consumer to consumer)により生まれる豊富で多彩な講座により個人の学習ニーズに応じた学びをみつけることができます。
これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版)
【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集(6回分390問)
今回は以上となります。
コメント