LoginSignup
0
1

More than 5 years have passed since last update.

aws上に作成したansibleサーバーでテストサイトを構築する(7) RDSの構成-2

Last updated at Posted at 2017-11-10

はじめに

前回は、RDSインスタンス作成のために必要となるサブネットグループなどのリソースを作成しました。
今回はRDSインスタンス本体の作成に入ります。

インスタンス情報の定義

まずは、作成したいRDSインスタンスの情報をgroup_varsで定義します。
前回作成した変数rdsに追加する形でまとめていきます。

DB名と、DBユーザー、パスワードは、WordPressに接続情報を設定するために使用するので、そちらで定義してインスタンス情報からはそれを参照するようにします。

group_vars/all.yml(部分)
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コマンドを使用することにしました。

roles/aws_rds/tasks/main.yml(追加)
- 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形式なので、タスク内で扱いやすいように変換しておきます。

roles/aws_rds/tasks/main.yml(追加)
- name: make rds instances list
  set_fact:
    rds_list: "{{ rds_instance_chk.stdout | from_json }}"

- debug: var=rds_list

RDSインスタンス作成

メインであるRDSインスタンス作成のタスクは以下のようになります。
group_varsで定義したrds.instancewith_itemsでループし、該当するインスタンスの名前が上のタスクで作成したrds_listに含まれていない場合にインスタンスの作成を実行します。

ここでもawsコマンドを使用していますが、これはrdsモジュールでインスタンスを作成すると、storage-typeを指定できず、マグネティックになってしまうためです。
なお、後続でrdsモジュールを使用した設定変更を行う構成とするので、ここではインスタンス作成に最低限必要なオプション(およびrdsモジュールで設定できないオプション)を指定しています。

roles/aws_rds/tasks/main.yml(追加)
- 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コマンドを使用して、作成したインスタンスのstatusavailableになるまで、untilで待機しています。
ここでは10秒ごとに確認して10分待っています。

roles/aws_rds/tasks/main.yml(追加)
- 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モジュールでの構成変更を行います。

roles/aws_rds/tasks/main.yml(追加)
- 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の設定を行っていきます。



0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1