LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-09

はじめに

前回までで、WebサーバーへのWordpressソースの展開まで完了しました。
今回は、wordpress用データベースとして使用するRDSインスタンスを作成する準備をします。

このページと次のページの内容については、全面的にこちらのページを参考にしました。

RDS操作権限追加

まず、最初の回でansibleサーバーに適用したIAMロールにはEC2の操作権限のみしか付与していないので、RDS操作の権限を追加します。

AWSマネジメントコンソールからIAMの管理ページに移動して、「ロール」を表示。
2017-11-08_16h34_32.png

ansibleサーバーに付与したロール「ansible_server_role」を選択。
2017-11-08_16h39_05.png

「アクセス権限」タブの「ポリシーのアタッチ」ボタンをクリック。
2017-11-08_16h41_45.png

AmazonRDSFullAccessを追加。
2017-11-08_16h42_52.png

これでansibleサーバーにRDSの操作権限が付与されました。

RDS用プレイブック作成

権限を付与したら、RDSを作成するロールを追加します。これは、AWSのリソースなのでaws_infra.ymlに追加することにします。

aws_infra.yml(変更)
 - hosts: localhost
   roles:
   - { role: aws_network, tags: [aws_network] }
+  - { role: aws_rds, tags: [aws_rds] }

 - hosts: all
   connection: local
   roles:
   - { role: aws_ec2, tags: [aws_ec2] }
command
$ mkdir -p roles/aws_rds/tasks

RDS周辺のリソース作成

RDSインスタンスを作成するには、RDS用のサブネットグループと、セキュリティグループを作っておく必要があるのでそれらの準備を行います。

RDSサブネットグループの準備

RDSサブネットグループは、RDSインスタンスを配置する、2つ以上のサブネットをまとめたものです。
インスタンスの起動先サブネットは1つなのですが、なぜか2つ以上のサブネットでグループを作らないといけないようです。

まず、group_vars/all.ymlにDB用のサブネット定義を2つ追加します。

group_vars/all.yml(変更部分)
 vpc:
   name: "testsite"
   region: "ap-northeast-1"
   cidr: "172.22.0.0/16"
   subnets:
   - name: "webapp1"
     cidr: "172.22.1.0/24"
     az: "ap-northeast-1a"
   - name: "webapp2"
     cidr: "172.22.2.0/24"
     az: "ap-northeast-1c"
+  - name: "database1"
+    cidr: "172.22.128.0/24"
+    az: "ap-northeast-1a"
+  - name: "database2"
+    cidr: "172.22.129.0/24"
+    az: "ap-northeast-1c"

さらに、rds関連の設定をまとめた変数をrdsという名前で追加することにします。
とりあえず先程追加したサブネットをグループとして定義します。

group_vars/all.yml(追加部分)
rds:
  subnet_group:
  - name: database
    description: 'private subnet group for database'
    subnets:
    - database1
    - database2

RDSサブネットグループを作成するタスクを追加します。
rds_subnet_groupモジュールを使いますが、サブネットの指定にsubnetIDが必要となるので、ec2_vpc_subnet_factsモジュールを使用して取得します。

まずは、aws_networkロールで作成したサブネットから先程定義したRDSサブネットグループに含まれるサブネットの情報を取得します。

roles/aws_rds/tasks/main.yml
---
- name: subnet id 取得
  ec2_vpc_subnet_facts:
    region: '{{ vpc.region }}'
    filters:
      "tag:Name": "{{ item.1 }}"
  with_subelements:
  - "{{ rds.subnet_group }}"
  - subnets
  register: subnet_fact

- debug: var=subnet_fact

次に取得した情報からRDSサブネットグループ名とサブネットIDを対応付けたディクショナリを組み立てます。

roles/aws_rds/tasks/main.yml(追加)
- name: subnet dict作成
  set_fact:
    subnets_dict: >-
      {%- set dict = {} -%}
      {%- set inc = 0 -%}
      {%- set subnet_group_cnt = rds.subnet_group | length -%}
      {%- for i in range(subnet_group_cnt) -%}
      {%-   set list = [] -%}
      {%-   for j in range(rds.subnet_group[i].subnets | length) -%}
      {%-     set _ = list.append(subnet_fact.results[inc+j].subnets[0].id) -%}
      {%-   endfor -%}
      {%-   set _ = dict.update({rds.subnet_group[i].name: list}) -%}
      {%-   set inc = inc + subnet_group_cnt -%}
      {%- endfor -%}
      {{ dict }}

- debug: var=subnets_dict

上で作成したディクショナリを使って、RDSサブネットグループを作成するタスクが以下となります。

roles/aws_rds/tasks/main.yml(追加)
- name: rds subnet group 作成
  rds_subnet_group:
    state: present
    name: "{{ item.name }}"
    description: "{{ item.description }}"
    region: "{{ vpc.region }}"
    subnets: >-
      {%- set list = subnets_dict[item.name] -%}
      {{ list }}
  with_items: "{{ rds.subnet_group }}"
  register: rds_subnet_group

- debug: var=rds_subnet_group

セキュリティグループの準備

セキュリティグループもgroup_vars/all.ymlにデータベースアクセス用のものを追加してaws_networkロールで作成します。

group_vars/all.yml(追加部分)
security_groups:
<< 中略 >>
  - name: "SG_database"
    description: "for RDS"
    rules:
    - proto: tcp
      from_port: 3306
      to_port: 3306
      cidr_ip: 172.22.0.0/16

サブネットと同じように、ec2_group_factsで取得した情報をもとに、名前とIDを紐づけたハッシュを作成します。

roles/aws_rds/tasks/main.yml(追加)
- name: security group id 取得
  ec2_group_facts:
    region: '{{ vpc.region }}'
    filters:
      group_name: "{{ item.1 }}"
  with_subelements:
    - "{{ rds.instance }}"
    - security_group
  register: sg_fact

- name: security group dict作成
  set_fact:
    sg_dict: >-
      {%- set dict = {} -%}
      {%- for i in range(sg_fact.results|length) -%}
      {%-   set _ = dict.update({sg_fact.results[i].security_groups[0].group_name: sg_fact.results[i].security_groups[0].group_id}) -%}
      {%- endfor -%}
      {{ dict }}

- debug: var=sg_dict

次回

ここまでで、RDSインスタンスの作成に必須となるリソースの準備ができました。
次回はRDSインスタンス本体の作成を行います。



1
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
1
1