APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

[Ansible] CloudFormation との使い分け(とあるトレーニング環境構築の場合)

この記事は、Ansible Advent Calendar 2021 (Adventar版) 23日目の記事です。(別途弊社のもあります

はじめに

こんにちは。ネットワーク事業部のACT(Automation Collabo Team)所属の横地です。

私達のチームでは、自律支援型ネットワーク運用自動化サービスのひとつとして、自動化トレーニングを提供しています。Ansibleを中心にした座学とハンズオンで構成されています。

ハンズオンの環境は、トレーニング開催のたびに作って壊してを繰り返すため、自動化しています。ツールとしてはAnsibleとCloudFormationを利用しています。

この2つの組み合わせについて、どのよに使い分ければよいか、という話をしばしば耳にします。Ansibleにも ec2_vpc_netモジュールや、ec2_instanceモジュールのように、AWSリソースを作成するモジュールがあるため、迷うこともあるかも知れません。

この記事では、ハンズオントレーニング環境の構築という限られたケースではありますが、私達の使い分け方をかんたんにご紹介します。

全体像

まずざっくりと処理の全体像を示します。(図はかなり簡略化しています)

f:id:akira6592:20211223082236p:plain
全体像

CloudFormationは各種AWSリソース作成を担当し、AnsibleはEC2インスタンス内のコンフィギュレーションを担当します。

また、CloudFormation自体はAnsibleから呼び出すことによって、構築時は ansible-playbook コマンドだけで済むようにしています。

以下、それぞれの部分について説明します。

(1) AnsibleからCloudFormation呼び出し

Ansibleのcloudformation モジュールでCloudFormationを呼び出す部分です。

対象ホストを localhost 1台として、受講者の人数分だけループして cloudformation モジュールを呼び出すかたちを基本としています。

# 実装イメージ
- name: create stacks
  cloudformation:
    stack_name: "training_env_user_{{ item }}"
    template: "training_env_cf.yml"
  loop: "{{ range(1, user_count + 1) | list }}"  # user_count は受講者人数

ただ、この方法の場合、ひとつのスタックの完成を待って次のループに進むため、結構な時間がかかります。

一部の環境パターンでは、試験的に高速化を図っています。以下のような方法です。

  • 受講者人数のループではなく、あらかじめ「1受講者=1ホスト」の形になるように add_host しておく
  • couldformation モジュールを各ホストごとに実行する

このように各ホストの処理にバラすと、並列実行できるため早くできます。理論上はfork数を増やせば早くなりそうですが、何かしらの数の制限に引っかからないように控えめにしています。ansible-plyabook コマンドの -l-f、Playbook内の throttleで調整しやすいという副次的なメリットもあります。

また、CloudFormationでは、EC2インスタンスに割り当てるEIPを取得して割り当てています。このEIPを、あとでEC2インスタンスにSSH接続するための変数として取っておきます。

SSH接続先の情報を準備する別のアプローチとしては、aws_ec2 インベントリプラグインを使う方法もいいかも知れません。

(2) CloudFormationによるAWSリソース作成

CloudFormationで、AWS上にVPCやEC2インスタンスなどの各種リソースを作成する部分です。

受講者によって異なる部分(EC2インスタンスのNameタグなど)をパラメータ化したテンプレートを準備しています。

(3) OSコンフィギュレーション

作成されたEC2インスタンスに対して、コンフィギュレーションする部分です。

ここまでくれば、特別なことはありません。yumpip モジュールなどで必要なものをインストールしたり、lineinfile モジュールで設定ファイルを編集したりしています。

この使い分けのメリット

前述のように、ハンズオン環境は開催のたびに作ったり消したりします。CloudFormationにリソース作成を任せると、消すのがとても簡単なのが助かっています。

おわりに

CloudFormationでAWS上のリソース作成、AnsibleでEC2インスタンスのコンフィギュレーションをし、CloudFormation自体もAnsibleから呼ぶ、という方法をご紹介しました。

そこまで特別な使い分けでもないと思いますし、あらゆるユースケースに対応する方法でもないと思いますが、少しでも参考になれば幸いです。

なお、この仕組みの基本形は同僚がつくってくれたものです。感謝🙏。