1.2. rds (create: DBインスタンス PostgreSQL Single AZ / Public)

作業の目的 [why]

DBインスタンス"db-postgresql-2017-11-20"を作成します。

完了条件/事前条件 [設計者用情報]

完了条件 [after]

主処理は、以下を満たしたときに成功したものとします。

完了条件1
DBインスタンス"db-postgresql-2017-11-20"が存在する。

事前条件 [before]

主処理の実施は、以下の状態であることを前提とします。

事前条件1
DBインスタンス"db-postgresql-2017-11-20"が存在しない。

前提と異なることが判明した場合、直ちに処理を中止します。

課題

(未検証)

作業対象 [what]

  • RDSサービス

標準時間

8分

前提条件

作業権限条件 [who]

本作業は、以下の作業権限を有する人が行います。

作業権限条件: RDSへの権限

RDSに対してフル権限があること。

作業環境条件 [where]

本作業は、以下の作業環境で行います。

作業環境条件1: OSとバージョン

Amazon Linuxの以下のバージョンで動作確認済

コマンド:

cat /etc/issue | head -1

結果(例):

Amazon Linux AMI release 2016.09

作業環境条件2: シェルとバージョン

bashの以下のバージョンで動作確認済

コマンド:

bash --version -v | head -1

結果(例):

GNU bash, バージョン 4.2.46(1)-release (x86_64-redhat-linux-gnu)

作業環境条件3: AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.117

コマンド:

aws --version

結果(例):

aws-cli/1.11.189 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.7.47

バージョンが古い場合は最新版に更新しましょう。

コマンド:

sudo -H pip install -U awscli

開始条件

作業に必要なモノ・情報 [resource]

作業開始には、以下が全て揃っていることが必要です。

リソース1: DBインスタンス名

  • 作成するDBインスタンスの名称です。
  • 今回は"db-postgresql-2017-11-20"とします。

リソース2: VPC名

  • DBサブネットグループに属するサブネット、セキュリティグループの存在するVPCの名称です。
  • 今回は"vpc-handson-2017-11-20"とします。

リソース3: DBサブネットグループ名

  • 作成するDBサブネットグループの名称です。
  • 今回は"postgresql-2017-11-20"とします。

リソース4: セキュリティーグループ名

  • 作成するDBインスタンスが利用するセキュリティーグループの名称です。
  • 今回は"postgresql-2017-11-20"とします。

リソース5: DBエンジンの決定

  • 作成するDBインスタンスが利用するの名称です。
  • 今回は"postgres"とします。

リソース6: DBインスタンスクラス

  • 作成するインスタンスが利用するインスタンスのクラス名です。
  • 今回は"db.t2.micro"とします。

リソース7: ストレージサイズ

  • 作成するDBインスタンスが利用するストレージのサイズです。
  • 今回は"5"とします。

リソース8: マスタユーザ名

  • インスタンスに作成するマスタユーザの名称です。
  • 今回は"pgadmin"とします。

リソース9: マスタパスワード

  • インスタンスに作成するマスタユーザのパスワードです。
  • 今回は"#dbPass123"とします。

リソース10: データベース名

  • インスタンスに作成するデフォルトデータベースの名称です。
  • 今回は"handson$(date +%Y%m%d)"とします。

作業開始 [when]

以下を全て満たしているとき、作業を開始します。

  • 開始の指示があった場合。

タスクの実施

0. パラメータの指定

まず変数の確認をします。

変数の確認:

cat << ETX

  # 0.a. AWS_DEFAULT_PROFILE:"<RDSのフル権限を許可されたプロファイル>"
         AWS_DEFAULT_PROFILE="${AWS_DEFAULT_PROFILE}"
  # 0.b. AWS_DEFAULT_REGION:"ap-northeast-1"
         AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 0.1. RDS_INSTANCE_IDENT:"db-postgresql-2017-11-20"
         RDS_INSTANCE_IDENT="${RDS_INSTANCE_IDENT}"
  # 0.2. VPC_TAG_NAME:"vpc-handson-2017-11-20"
         VPC_TAG_NAME="${VPC_TAG_NAME}"
  # 0.3. RDS_SUBNET_GROUP_NAME:"postgresql-2017-11-20"
         RDS_SUBNET_GROUP_NAME="${RDS_SUBNET_GROUP_NAME}"
  # 0.4. VPC_SG_NAME:"postgresql-2017-11-20"
         VPC_SG_NAME="${VPC_SG_NAME}"
  # 0.5. RDS_ENGINE_NAME:"postgres"
         RDS_ENGINE_NAME="${RDS_ENGINE_NAME}"
  # 0.6. RDS_INSTANCE_CLASS:"db.t2.micro"
         RDS_INSTANCE_CLASS="${RDS_INSTANCE_CLASS}"
  # 0.7. RDS_STORAGE_SIZE:"5"
         RDS_STORAGE_SIZE="${RDS_STORAGE_SIZE}"
  # 0.8. RDS_USER_NAME:"pgadmin"
         RDS_USER_NAME="${RDS_USER_NAME}"
  # 0.9. RDS_USER_PASS:"#dbPass123"
         RDS_USER_PASS="${RDS_USER_PASS}"
  # 0.10. RDS_DB_NAME:"handson$(date +%Y%m%d)"
          RDS_DB_NAME="${RDS_DB_NAME}"

ETX

下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号について作業を行います。

0.a. プロファイルの指定

プロファイルの一覧を確認します。

コマンド:

cat ~/.aws/credentials \
 | grep '\[' \
 | sed 's/\[//g' | sed 's/\]//g'

結果(例):

iamFull-prjz-mbpr13
<RDSのフル権限を許可されたプロファイル>

変数の設定:

export AWS_DEFAULT_PROFILE='<RDSのフル権限を許可されたプロファイル>'

0.b. リージョンの指定

変数の設定

export AWS_DEFAULT_REGION='ap-northeast-1'

0.1. DBインスタンス名

作成するDBインスタンスの名を指定します。

変数の設定:

RDS_INSTANCE_IDENT='db-postgresql-2017-11-20'

0.2 VPC名

VPC名を指定します。

変数の設定:

VPC_TAG_NAME='vpc-handson-2017-11-20'

0.3. DBサブネットグループ名の指定

DBサブネットグループ名を指定します。

変数の設定:

RDS_SUBNET_GROUP_NAME='postgresql-2017-11-20'

0.4. セキュリティーグループ名

セキュリティーグループ名を指定します。

変数の設定:

VPC_SG_NAME='postgresql-2017-11-20'

0.5. DBエンジンの決定

DBインスタンス名を指定します。

変数の設定:

RDS_ENGINE_NAME='postgres'

0.6. DBインスタンスクラス

インスタンスクラスを指定します。

変数の設定:

RDS_INSTANCE_CLASS='db.t2.micro'

0.7. ストレージサイズ

ストレージサイズを指定します。

変数の設定:

RDS_STORAGE_SIZE='5'

0.8. マスタユーザ名

マスタユーザ名を指定します。

変数の設定:

RDS_USER_NAME='pgadmin'

0.9. マスタパスワード

マスタユーザのパスワードを指定します。

変数の設定:

RDS_USER_PASS='#dbPass123'

0.10. データベース名

デフォルトデータベース名を指定します。

変数の設定:

RDS_DB_NAME="handson$(date +%Y%m%d)"

再確認

設定されている変数の内容を再確認します。

変数の確認:

cat << ETX

  # 0.a. AWS_DEFAULT_PROFILE:"<RDSのフル権限を許可されたプロファイル>"
         AWS_DEFAULT_PROFILE="${AWS_DEFAULT_PROFILE}"
  # 0.b. AWS_DEFAULT_REGION:"ap-northeast-1"
         AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 0.1. RDS_INSTANCE_IDENT:"db-postgresql-2017-11-20"
         RDS_INSTANCE_IDENT="${RDS_INSTANCE_IDENT}"
  # 0.2. VPC_TAG_NAME:"vpc-handson-2017-11-20"
         VPC_TAG_NAME="${VPC_TAG_NAME}"
  # 0.3. RDS_SUBNET_GROUP_NAME:"postgresql-2017-11-20"
         RDS_SUBNET_GROUP_NAME="${RDS_SUBNET_GROUP_NAME}"
  # 0.4. VPC_SG_NAME:"postgresql-2017-11-20"
         VPC_SG_NAME="${VPC_SG_NAME}"
  # 0.5. RDS_ENGINE_NAME:"postgres"
         RDS_ENGINE_NAME="${RDS_ENGINE_NAME}"
  # 0.6. RDS_INSTANCE_CLASS:"db.t2.micro"
         RDS_INSTANCE_CLASS="${RDS_INSTANCE_CLASS}"
  # 0.7. RDS_STORAGE_SIZE:"5"
         RDS_STORAGE_SIZE="${RDS_STORAGE_SIZE}"
  # 0.8. RDS_USER_NAME:"pgadmin"
         RDS_USER_NAME="${RDS_USER_NAME}"
  # 0.9. RDS_USER_PASS:"#dbPass123"
         RDS_USER_PASS="${RDS_USER_PASS}"
  # 0.10. RDS_DB_NAME:"handson$(date +%Y%m%d)"
          RDS_DB_NAME="${RDS_DB_NAME}"

ETX

1. 前処理

1.1. 処理対象の状態確認

主処理の実施は、以下の状態であることを前提とします。

前提と異なることが判明した場合、直ちに処理を中止します。

事前条件1: DBインスタンス"db-postgresql-2017-11-20"が存在しない。

「DBインスタンス"db-postgresql-2017-11-20"が存在しない。」ことを確認します。

コマンド:

aws rds describe-db-instances \
  --query "DBInstances[?DBInstanceIdentifier == \`${RDS_INSTANCE_IDENT}\`].DBInstanceIdentifier"

結果(例):

[]

1.2. 主処理に必要な情報の取得

変数の設定:

EC2_TAG_KEY='Name'

VPC IDの取得

VPC IDを取得します。

コマンド:

VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters Name=tag:${EC2_TAG_KEY},Values=${VPC_TAG_NAME}  \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
  && echo ${VPC_ID}

結果(例):

vpc-xxxxxxxx

セキュリティグループIDの取得

セキュリティグループIDを取得します。

コマンド:

VPC_SG_ID=$( \
  aws ec2 describe-security-groups \
    --filter Name=vpc-id,Values=${VPC_ID} \
      Name=group-name,Values=${VPC_SG_NAME} \
    --query "SecurityGroups[].GroupId" \
    --output text \
) \
  && echo ${VPC_SG_ID}

結果(例):

sg-xxxxxxxx

セキュリティグループの配列への追加

変数の設定:

ARRAY_SG_ID="${VPC_SG_ID} ${ARRAY_SG_ID}" \
  && echo ${ARRAY_SG_ID}

2. 主処理

DBインスタンスの作成

変数の確認:

cat << ETX

    RDS_INSTANCE_IDENT:    ${RDS_INSTANCE_IDENT}
    RDS_STORAGE_SIZE:      ${RDS_STORAGE_SIZE}
    RDS_INSTANCE_CLASS:    ${RDS_INSTANCE_CLASS}
    RDS_ENGINE_NAME:       ${RDS_ENGINE_NAME}
    RDS_USER_NAME:         ${RDS_USER_NAME}
    RDS_USER_PASS:         ${RDS_USER_PASS}
    RDS_DB_NAME:           ${RDS_DB_NAME}
    ARRAY_SG_ID:           ${ARRAY_SG_ID}
    RDS_SUBNET_GROUP_NAME: ${RDS_SUBNET_GROUP_NAME}

ETX

コマンド:

aws rds create-db-instance \
    --db-instance-identifier ${RDS_INSTANCE_IDENT} \
    --allocated-storage ${RDS_STORAGE_SIZE} \
    --db-instance-class ${RDS_INSTANCE_CLASS} \
    --engine ${RDS_ENGINE_NAME} \
    --master-username ${RDS_USER_NAME} \
    --master-user-password ${RDS_USER_PASS} \
    --db-name ${RDS_DB_NAME} \
    --db-subnet-group-name ${RDS_SUBNET_GROUP_NAME} \
    --vpc-security-group-ids ${ARRAY_SG_ID} \
    --publicly-accessible \
    --multi-az

結果(例):

(省略)

3. 後処理

3.1. 状態確認に必要な情報の取得

DBインスタンスの状態確認

コマンド:

RDS_INSTANCE_STATUS=$( \
    aws rds describe-db-instances \
      --db-instance-identifier ${RDS_INSTANCE_IDENT} \
      --query 'DBInstances[].DBInstanceStatus' \
      --output text \
) \
      && echo ${RDS_INSTANCE_STATUS}

結果(例):

available

3.2. 完了条件の確認

主処理は、以下を満たしたときに成功したものとします。

完了条件1: DBインスタンス"db-postgresql-2017-11-20"が存在する。

「DBインスタンス"db-postgresql-2017-11-20"が存在する。」ことを確認します。

コマンド:

aws rds describe-db-instances \
  --query "DBInstances[?DBInstanceIdentifier == \`${RDS_INSTANCE_IDENT}\`].DBInstanceIdentifier"

結果(例):

[
  "db-postgresql-2017-11-20"
]

3.3. 後処理に必要な作業

エンドポイントの確認

変数の設定:

RDS_INSTANCE_ENDPOINT=$( \
    aws rds describe-db-instances \
      --db-instance-identifier ${RDS_INSTANCE_IDENT} \
      --query 'DBInstances[].Endpoint.Address' \
      --output text \
) \
    && echo ${RDS_INSTANCE_ENDPOINT}

結果(例):

db-postgresql-2017-11-20.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com

接続情報設定ファイルの作成

変数の確認:

cat << ETX

    RDS_INSTANCE_ENDPOINT: ${RDS_INSTANCE_ENDPOINT}
    VPC_SG_PORT:           ${VPC_SG_PORT}
    RDS_DB_NAME:           ${RDS_DB_NAME}
    RDS_USER_NAME:         ${RDS_USER_NAME}
    RDS_USER_PASS:         ${RDS_USER_PASS}

ETX

コマンド:

echo "${RDS_INSTANCE_ENDPOINT}:${VPC_SG_PORT}:${RDS_DB_NAME}:${RDS_USER_NAME}:${RDS_USER_PASS}" >> ${HOME}/.pgpass \
  && chmod 600 ${HOME}/.pgpass \
  && cat ${HOME}/.pgpass

接続

コマンド:

psql \
    --host=${RDS_INSTANCE_ENDPOINT} \
    --username=${RDS_USER_NAME} \
    --dbname=${RDS_DB_NAME}

結果(例):

psql (9.5.5, server 9.5.4)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

handson20161114=>

DBコマンドのテスト実行をしてみます。

SQL:

select version();

結果(例):

                                                 version
----------------------------------------------------------------------------------------------------------
  PostgreSQL 9.5.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-bit
 (1 row)

切断

DBへの接続を切断します。

コマンド:

\q

完了