24時間365日フルマネージドホスティングサービスのデイーネット

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はコードを書くツールとして今後も使ってみようかと思いました。

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

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar