はじめに
前回までで、WebサーバーへのWordpressソースの展開まで完了しました。
今回は、wordpress用データベースとして使用するRDSインスタンスを作成する準備をします。
- aws上に作成したansibleサーバーでテストサイトを構築する
このページと次のページの内容については、全面的にこちらのページを参考にしました。
RDS操作権限追加
まず、最初の回でansibleサーバーに適用したIAMロールにはEC2の操作権限のみしか付与していないので、RDS操作の権限を追加します。
AWSマネジメントコンソールからIAMの管理ページに移動して、「ロール」を表示。
ansibleサーバーに付与したロール「ansible_server_role」を選択。
「アクセス権限」タブの「ポリシーのアタッチ」ボタンをクリック。
これでansibleサーバーにRDSの操作権限が付与されました。
RDS用プレイブック作成
権限を付与したら、RDSを作成するロールを追加します。これは、AWSのリソースなので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] }
$ mkdir -p roles/aws_rds/tasks
RDS周辺のリソース作成
RDSインスタンスを作成するには、RDS用のサブネットグループと、セキュリティグループを作っておく必要があるのでそれらの準備を行います。
RDSサブネットグループの準備
RDSサブネットグループは、RDSインスタンスを配置する、2つ以上のサブネットをまとめたものです。
インスタンスの起動先サブネットは1つなのですが、なぜか2つ以上のサブネットでグループを作らないといけないようです。
まず、group_vars/all.yml
にDB用のサブネット定義を2つ追加します。
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という名前で追加することにします。
とりあえず先程追加したサブネットをグループとして定義します。
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サブネットグループに含まれるサブネットの情報を取得します。
---
- 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を対応付けたディクショナリを組み立てます。
- 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サブネットグループを作成するタスクが以下となります。
- 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
ロールで作成します。
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を紐づけたハッシュを作成します。
- 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インスタンス本体の作成を行います。