AnsibleでAWSリソースを操作してみる

こんにちは。

ディーネットで構築業務を担当しております、下地です。

ゴールデンウィークは、色々遊びつつ合間にAWS Innovateを見たりして過ごしたのですが、5月7日のInnovate終了後に沢山修了書が届きました(ちゃんと全部見るとカテゴリ別に修了書もらえるようです

さて、今回はAnsibleについてです。

私は個人的に構成管理ツールやInfrastracture as Codeといった考え方が好きなのですが、今回はCloudFormationではなくて、AnsibleでVPCやEC2といったAWSリソースを作成してみようと思います。

宜しくお願いします。

Ansibleについて簡単に

Ansibleはマルチレイヤーに対応している構成管理ツールです。

OSやミドルウェアの設定など、従来の守備範囲であるConfiguration Managementに加えて、Bootstrappingの領域までカバーします。

更には、A10やF5、CiscoといったNW機器も操作する事ができます。

今回はこれら豊富な機能の中から、AWSにおけるBootstrappingの処理をAnsibleでやってみます。

AnsibleでAWSやAzureなどのパブリッククラウドのリソースを操作するモジュールは「Cloud modules」に分類されます。

モジュール一覧.JPG

下準備

まずターゲットとなるAWSアカウント内でEC2を立てて、その中でAnsibleを実行する形で試します。

普通にEC2を作成して使っても良いのですが、2019年4月よりCloud9が東京リージョンでも利用できるようになった為「早速使いたい!」という理由で、今回はCloud9環境にAnsibleをインストールして実行してみようと思います。

参考:Amazon Web Services ブログ AWS Cloud9 が東京リージョンに対応しました

Cloud9の環境づくり

これはマネジメントコンソールからポチポチと3ステップで作成できます。

まずCloud9のメニューを開いて、環境を作ります。「Create environment」をクリック。

cloud9-1.JPG

詳細を設定していきます。

まずStep1。Nameを入力します。

Descriptionは必要であれば都度入れますが、今回は空欄としました。

cloud9-2.JPG

次にStep2。

Cloud9が動作するEC2インスタンスの詳細を決めていきます。

以下の部分は全てデフォルトにしました。

「After 30 minutes」の部分は、ほったらかしておくとEC2を自動でシャットダウンしてくれるまでの時間です。

これにより「オンデマンドでEC2の料金を沢山請求される」という事を防げます。

cloud9-3.JPG

下にスクロールすると、VPCとサブネットを選択するプルダウンが出ます。

今回はあらかじめCloud9用に用意しておいたVPCとサブネットを利用します。

cloud9-4.JPG

次に進むとStep3は確認画面ですので、Create environmentで作成できます。

するとしばらく実行中となり、その後環境が作成されてブラウザから利用できるようになります。

cloud9-5.JPG

こんな感じでできました。

ブラウザから統合開発環境として利用できます。

また、下のウィンドウでEC2上のコンソール操作をブラウザ経由で行う事ができます。

cloud9-6.JPG

基盤はEC2なので、Cloud9用に作成されたインスタンスも確認できます。

cloud9-7.JPG

これで環境ができました。

Ansibleをインストールする

Cloud9ではブラウザからbashを操作できます。

cloud9-8.JPG

最初はec2-userでシェルログインしています。

この環境にpip及びAnsibleをインストールしました。

まず現況を確認して、

シェル0.JPG

pipのインストールスクリプトをダウンロードします。

シェル1.JPG

ダウンロードしたスクリプトを実行してpipをインストールします。

シェル2.JPG

インストールしたpipを利用してAnsibleをインストールします。

シェル3.JPG

これでAnsibleが動作するので、適当なAnsibleコマンドを利用して動作確認をします。

シェル4.JPG

(コードを記述したら表示がおかしくなったので画像で失礼します)

Cloud9用のEC2にIAMロールをかぶせておく

今回はAdministratorAccessを付与したテスト用IAMロールを用意して、それをアタッチしました。

iam-role1.JPG

Playbookを作成する

ここからAnsibleのPlaybookを記述します。

このPlaybookで作成されるAWSリソースは、

  • VPC
  • インターネットゲートウェイ
  • サブネット
  • ルートテーブル
  • ルート
  • セキュリティグループ
  • キーペア
  • EC2インスタンス

です。

PlaybookはCloud9を使って記述します。

まずは新規ファイルを作成。

cloud9-9.JPG

名前は「ansibletest.yml」としました。

cloud9-10.JPG

これを開くと、右側のエディタで編集ができます。

初期設定だと操作はvimモードで行えます。

エディタは設定変更でEmacsや他モードも利用できますよ。

以下の感じで書いていきます。

cloud9-11.JPG

これでplaybookを作成しました。

一部自社の拠点IPの記載部分のみ伏字にしております。

---
- hosts: localhost
tasks:
- name: "create vpc"
ec2_vpc_net:
name: "testvpcbyansible"
cidr_block: "10.0.0.0/16"
region: ap-northeast-1
tags:
mytag: ansiblemade
register: vpc_net
- name: "create internet gataway"
ec2_vpc_igw:
state: present
region: ap-northeast-1
vpc_id: "{{ vpc_net.vpc.id }}"
tags:
Name: testigwbyansible
mytag: ansiblemade
register: vpc_igw
- name: "create subnet"
ec2_vpc_subnet:
state: present
vpc_id: "{{ vpc_net.vpc.id }}"
region: ap-northeast-1
cidr: 10.0.0.0/24
tags:
Name: testsubnetbyansible
mytag: ansiblemade
register: vpc_subnet
- name: "create routetable for subnet"
ec2_vpc_route_table:
state: present
region: ap-northeast-1
vpc_id: "{{ vpc_net.vpc.id }}"
subnets: "{{ vpc_subnet.subnet.id }}"
routes:
- dest: 0.0.0.0/0
gateway_id: "{{ vpc_igw.gateway_id }}"
tags:
Name: testroutetablebyansible
mytag: ansiblemade
- name: "create securitygroup for ec2"
ec2_group:
name: testsecuritygroupbyansible
description: http and denet office
region: ap-northeast-1
vpc_id: "{{ vpc_net.vpc.id }}"
rules:
- proto: tcp
from_port: 80
to_port: 80
cidr_ip: 0.0.0.0/0
- proto: tcp
from_port: 0
to_port: 65535
cidr_ip: ■■■.■■■.■■■.■■■/32
tags:
Name: testsecuritygroupbyansible
mytag: ansiblemade
register: ec2_securitygroup
- name: "create key-pair for ec2"
ec2_key:
region: ap-northeast-1
name: mytestkey_madebyansible
register: ec2_keypair
- name: "create ec2"
ec2:
region: ap-northeast-1
key_name: "{{ ec2_keypair.key.name }}"
instance_type: t2.micro
image: ami-0f9ae750e8274075b
group: "{{ ec2_securitygroup.group_name }}"
wait: yes
vpc_subnet_id: "{{ vpc_subnet.subnet.id }}"
assign_public_ip: yes
volumes:
- device_name: /dev/xvda
volume_type: gp2
volume_size: 8
instance_tags:
Name: shimojitestserverbyansible
mytag: ansiblemade
count_tag:
Name: shimojitestserverbyansible
exact_count: 1

それでは実行してみます。

一般ユーザだと上手く行かなかったのでrootユーザにスイッチして実施してみました。

webのインターフェースから実施。

testdo1.JPG

すると最後までちゃんと流れました。

testdo2.JPG

また、キーペアを作成したときの秘密鍵情報はどうやって出力するのかな?と思っていたのですが、

実行結果にそのまま文字列として出力されました。

ただし-vオプションが必要です。

testdo3.JPG

加えて、冪等性を確認するため、もう一度実施してみます。

すると以下の感じで、既にリソースが作成されているため、全てOKでスキップされました。

単純に2回流すと冪等性は大丈夫のようです。

testdo4.JPG

実際に作成されたリソースを確認すると、例えばEC2はちゃんと出来ています。

testdo5.JPG

作成されたキーペアを利用してのSSH接続も大丈夫でした。

testdo6.JPG

こんな感じでAnsibleでもAWSリソースを操作できることが分かりました。

気になる点

作成したPlaybookを色々試していると、以下のような挙動がありました。

  • リソースの名前を変えるとリネームされるのではなく新しくリソースがまた作成される
  • EC2の冪等性はcount_tagとexact_countを組み合わせる必要があり多少面倒

などなどです。

CloudFormationだとChangeSetを利用してリソースの更新ができますが、Ansibleは難しそうです。

検証しておいて何ですが、わざわざリソース操作にAnsibleを使うよりは、CloudFormationやTerraformを素直に使ったほうが良いかなと感じました。

まとめ

今回はとりあえず出来るかどうかを試す感じでしたが、Ansibleでもクラウドリソースを操作することができました。

ただ他にも便利なサービスやツールが色々ありますので、適材適所でそれぞれを使えるともっと良さそうです。

またCloud9はコードを書くツールとして今後も使ってみようかと思いました。

今回もお読み頂きありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA