【AWS・Ansible】 コマンド１つでAmazon EC2インスタンス作成

2020/06/12
Ansibieはナンセンス！
Terraformで書きましょう！
ーーーーーーーーーーーーー

構成管理ツールAnsibleを使って、以下を作成します。

- EC2
- ElasticIP

後述する「事前準備」が完了しましたら、
以下のコマンドで、いつでも同様の環境が作れるようになります。

# 実行コマンド

```
$ ansible-playbook -i hosts/[環境名] aws-ec2.yml
```

実行には、aws profileの設定が必要になります。
AWSアカウント情報をパラメータファイルに記載し実行することも可能ですが、
セキュリティ面を考慮し、aws profileを使用しました。

まだ設定されていない方は、以下の公式ドキュメントを参考に設定を行ってください。

[名前付きプロファイル - AWS CLI の設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-multiple-profiles.html)



# 事前準備

以下が必要になります。
足りないのもは、インストールしてください。

- boto
- python >= 2.6
- Jinja2


次に、以下のファイルを作成しましょう。

## Playbookファイル

このファイルでは、実行するTaskを定義します。
コマンドを実行すると、上からTaskが順に実行されます。


```aws-ec2.yml
---
- hosts: localhost
  connection: local
  gather_facts: False
  become: False
  tasks:
    - name: "Facts Subnet"
      ec2_vpc_subnet_facts:
        profile: "{{ profile }}"
        region: "{{ region }}"
      check_mode: no
      register: _subnet_facts
    - debug: var=_subnet_facts verbosity=1
    - name: "EC2"
      ec2:
        image: "{{ item.image }}"
        instance_profile_name: "{{ item.instance_profile_name }}"
        instance_type: "{{ item.instance_type }}"
        key_name: "{{ item.key_name }}"
        vpc_subnet_id: "{{ _subnet_facts.subnets | selectattr('tags.Name', 'defined') | selectattr('tags.Name', 'equalto', item.subnet_name) |  map(attribute='id') | first }}"
        group: "{{ item.group }}"
        volumes:　"{{ item.volume }}"
        instance_tags: "{{ item.instance_tags }}"
        count_tag:
          Name: "{{ item.name }}"
        exact_count: 1
        assign_public_ip: "{{ item.assign_public_ip }}"
        profile: "{{ profile }}"
        region: "{{ region }}"
      register: _ec2
      with_items: "{{ ec2 }}"
    - debug: var=_ec2 verbosity=1
    - name: "Elastic IP"
      ec2_eip:
        device_id: "{{ _ec2.results | selectattr('item.name', 'equalto', item.name) | map(attribute='tagged_instances.id') | first }}"
        profile: "{{ profile }}"
        region: "{{ region }}"
      register: _ec2_eip
      with_items: "{{ ec2 }}"
      when: item.assign_public_ip == flase
    - debug: var=_ec2_eip verbosity=1
```

## パラメータファイル

構築する際の設定パラメータをこのファイルに集約します。
構築したい環境に合わせて、パラメータを記載してください。

なお、ファイルの配置先は、環境名に合わせて配置してください。

環境別にフォルダを分けて、パラメータファイルを作成することで、
開発/検証/本番 環境など、各環境に応じて動的に構築可能となります。

```hosts/[環境名]/group_vars/all.yml
---
# Common
env: [環境名]
profile: [プロファイル名]
region: [リージョン]

# EC2
ec2:
  - name: [EC2インスタンス名]
    instance_type: [インスタンスサイズ]
    image: [イメージ]
    instance_profile_name: [IAM Role名]
    key_name: [鍵ペアー名]
    subnet_name: [サブネット名]
    group: 
      - [セキュリティ名]
      ・
      ・
      ・
    tags:
      Name: [インスタンス名]
      Env: "{{ env }}"
    root_volume_size:
      - device_name: /dev/xvda
        volume_type: gp2
        volume_size: [ボリュームサイズ]
        delete_on_termination: true
      ・
      ・
      ・
    assign_public_ip: [tru or flase]

  - name: 
  ・
  ・
  ・
```

# おわりに

今回は、構成管理ツールAnsibleを使いましたが、
AWSのCloud formationでも、同様のことができます。

ただ、Ansibleの場合、システム内構築（SSH、OSユーザーなど）なども定義することができ、
おすすめのツールです。


Ansibleの良いところは、
事前にTaskさえ定義しておけば、後はプロジェクトや環境に合わせて設定パラメータを用意するだけ。
簡単に基盤構築ができてしまうところです。

AWS Consoleから手作業で構築するより、
Ansibleで構築した方が、圧倒的に工数を短縮することができます。


お仕事で、AWSの基盤構築されてる方は、是非、Ansibleを活用してみてください。