はじめに
前回は、RDSインスタンス作成のために必要となるサブネットグループなどのリソースを作成しました。
今回はRDSインスタンス本体の作成に入ります。
- aws上に作成したansibleサーバーでテストサイトを構築する
インスタンス情報の定義
まずは、作成したいRDSインスタンスの情報をgroup_vars
で定義します。
前回作成した変数rdsに追加する形でまとめていきます。
DB名と、DBユーザー、パスワードは、WordPressに接続情報を設定するために使用するので、そちらで定義してインスタンス情報からはそれを参照するようにします。
wordpress:
root: /var/lib
alias: wordpress
user: '{{ php_fpm.user }}'
group: '{{ php_fpm.group }}'
dbname: wordpress
dbuser: wordpress
dbpass: fzlp8tzjkqcadUl=wqnmgrdnLehlcrh7
rds:
subnet_group:
- name: database
description: 'private subnet group for database'
subnets:
- database1
- database2
instance:
- name: '{{ wordpress.dbname }}'
db_engine: MariaDB
engine_version: 10.1.23
multi_zone: no
publicly_accessible: no
zone: a
size: 5
instance_type: db.t2.micro
storage_type: gp2
subnet_group: database
security_group:
- SG_database
username: '{{ wordpress.dbuser }}'
password: '{{ wordpress.dbpass }}'
tags:
- key: Role
value: wordpress
RDSインスタンスの存在確認
冪当性確保のため、インスタンス作成の前に作成しようとしているインスタンスが存在しないことを確認します。
これにはaws
コマンドをshellモジュールで実行することにします。
rdsモジュールにもインスタンスの情報を取得するfacts
コマンドがあるのですが、1つずつインスタンス名を指定するループにしなければならないのと、インスタンスが存在しないとFailedになってしまい扱いが面倒なので、インスタンス名を指定しなくても存在するインスタンス名の一覧を取得できるaws
コマンドを使用することにしました。
- name: check rds instance
shell: aws rds describe-db-instances \
--query 'DBInstances[].DBInstanceIdentifier'
environment:
AWS_DEFAULT_REGION: "{{ vpc.region }}"
failed_when: no
changed_when: no
register: rds_instance_chk
- debug: var=rds_instance_chk
出力はJSON形式なので、タスク内で扱いやすいように変換しておきます。
- name: make rds instances list
set_fact:
rds_list: "{{ rds_instance_chk.stdout | from_json }}"
- debug: var=rds_list
RDSインスタンス作成
メインであるRDSインスタンス作成のタスクは以下のようになります。
group_vars
で定義したrds.instance
をwith_items
でループし、該当するインスタンスの名前が上のタスクで作成したrds_listに含まれていない場合にインスタンスの作成を実行します。
ここでもaws
コマンドを使用していますが、これはrdsモジュールでインスタンスを作成すると、storage-typeを指定できず、マグネティックになってしまうためです。
なお、後続でrds
モジュールを使用した設定変更を行う構成とするので、ここではインスタンス作成に最低限必要なオプション(およびrdsモジュールで設定できないオプション)を指定しています。
- name: RDS instance 作成
shell: >-
aws rds create-db-instance \
--db-name {{ item.name }} \
--db-instance-identifier {{ item.name }} \
--db-instance-class {{ item.instance_type }} \
--allocated-storage {{ item.size }} \
--engine {{ item.db_engine }} \
--master-username {{ item.username }} \
--master-user-password {{ item.password }} \
--availability-zone {{ vpc.region }}{{ item.zone }} \
--db-subnet-group-name {{ item.subnet_group }} \
--engine-version {{ item.engine_version }} \
--storage-type {{ item.storage_type }} \
--copy-tags-to-snapshot \
{% if item.publicly_accessible == True %}
--publicly_accessible \
{% else %}
--no-publicly-accessible \
{% endif %}
--tags \
{% set tag_list = [] %}
{%- for i in range(item.tags|length) -%}
{%- set _ = tag_list.append("Key="+item.tags[i]['key']+",Value="+item.tags[i]['value']) -%}
{%- endfor -%}
{{ tag_list | join( ' ' ) }}
environment:
AWS_DEFAULT_REGION: "{{ vpc.region }}"
when: item.name not in rds_list
with_items: "{{ rds.instance }}"
register: create_rds_instance
インスタンス作成完了まで待機
この後はrds
モジュールによる設定変更を行いますが、インスタンスの作成に時間がかかる(ここでの構成で試した限りでは大体5分強)ため、操作ができるようになるまで待機する必要があるのでそのためのタスクを追加します。
インスタンス作成前の存在チェックと同様にaws
コマンドを使用して、作成したインスタンスのstatus
がavailable
になるまで、until
で待機しています。
ここでは10秒ごとに確認して10分待っています。
- name: check rds instance
shell: >-
aws rds describe-db-instances \
--db-instance-identifier {{ item.name }} \
--query 'DBInstances[].DBInstanceStatus'
environment:
AWS_DEFAULT_REGION: "{{ vpc.region }}"
register: rds_instance_chk
changed_when: no
until: rds_instance_chk.stdout.find("available") != -1
retries: 60
delay: 10
with_items: "{{ rds.instance }}"
- debug: var=rds_instance_chk
インスタンス構成の変更
インスタンスが使用可能になったらrds
モジュールでの構成変更を行います。
- name: rds instance modified
rds:
command: modify
region: "{{ vpc.region }}"
instance_name: "{{ item.name }}"
apply_immediately: yes
backup_retention: "{{ item.backup_retention | default(omit) }}"
backup_window: "{{ item.backup_window | default(omit) }}"
instance_type: "{{ item.instance_type | default(omit) }}"
maint_window: "{{ item.maint_window | default(omit) }}"
multi_zone: "{{ item.multi_zone | default('no') }}"
publicly_accessible: "{{ item.publicly_accessible | default('no') }}"
parameter_group: "{{ item.parameter_group | default(omit) }}"
vpc_security_groups: >-
{%- set sg_list = [] -%}
{%- for i in range(item.security_group | length) -%}
{%- set _ = sg_list.append(sg_dict[item.security_group[i]]) -%}
{%- endfor -%}
{{ sg_list | join( ',' ) }}
size: "{{ item.size }}"
wait: yes
with_items: "{{ rds.instance }}"
次回
前回、今回で、RDSインスタンス作成が完了しました。
次回は、作成したRDSインスタンスへの接続など、WordPressの設定を行っていきます。