2020/06/12
Ansibieはナンセンス!
Terraformで書きましょう!
ーーーーーーーーーーーーー
構成管理ツールAnsibleを使って、以下を作成します。
- EC2
- ElasticIP
後述する「事前準備」が完了しましたら、
以下のコマンドで、いつでも同様の環境が作れるようになります。
実行コマンド
$ ansible-playbook -i hosts/[環境名] aws-ec2.yml
実行には、aws profileの設定が必要になります。
AWSアカウント情報をパラメータファイルに記載し実行することも可能ですが、
セキュリティ面を考慮し、aws profileを使用しました。
まだ設定されていない方は、以下の公式ドキュメントを参考に設定を行ってください。
事前準備
以下が必要になります。
足りないのもは、インストールしてください。
- boto
- python >= 2.6
- Jinja2
次に、以下のファイルを作成しましょう。
Playbookファイル
このファイルでは、実行するTaskを定義します。
コマンドを実行すると、上からTaskが順に実行されます。
---
- 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
パラメータファイル
構築する際の設定パラメータをこのファイルに集約します。
構築したい環境に合わせて、パラメータを記載してください。
なお、ファイルの配置先は、環境名に合わせて配置してください。
環境別にフォルダを分けて、パラメータファイルを作成することで、
開発/検証/本番 環境など、各環境に応じて動的に構築可能となります。
---
# 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を活用してみてください。