8
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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

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

  • EC2
  • ElasticIP

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

実行コマンド

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

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

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

名前付きプロファイル - AWS CLI の設定

事前準備

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

  • 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を活用してみてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
8
Help us understand the problem. What are the problem?