0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon RDS マルチ AZ 配置(2つの読み取り可能なスタンバイ)IAM データベース認証

Last updated at Posted at 2025-06-18

はじめに

こんにちは。株式会社ジールの@r_sasakiです。
今回は「Amazon RDS マルチ AZ 配置(2つの読み取り可能なスタンバイ)IAM データベース認証」についての検証結果をご紹介します。

1. 背景・目的

1.1. 背景

 2024年10月にAmazon RDSで、2つの読み取り可能なスタンバイを備えた Amazon RDS マルチAZ配置で、AWS IAM データベース認証がサポート開始されました。
 以前は、複数AZそれぞれでシングルAZ構成のRDSインスタンスを立てて、ロードバランサーでアクセスを振り分ける必要があったが、このアップデートにより、IAM データベース認証を利用することでEC2、Lambda等からRDSにアクセスする際、パスワードを利用した認証が不要となりました。

1.2. 目的

・Amazon RDS マルチ AZ 配置(2つの読み取り可能なスタンバイ)でのIAM データベース認証の設定方法を紹介する。
・マルチ AZ 配置のAmazon RDSインスタンス(2つの読み取り可能なスタンバイ)の構成で、既存のシングルスタンバイ構成と同様に、IAMデータベース認証が利用できるかを検証する。
・これらのサービスの解説と検証を通して、Amazon RDSを業務で利用する開発者やAWS導入企業担当者に対して、本アップデートに関連するサービスへの理解を深められるような発信をする。

2. アップデート関連サービス概要

2.1. Amazon RDS マルチ AZ 配置の概要

・プライマリDBインスタンスとは別のAZに、スタンバイDBインスタンスを持つDB構成
・スタンバイDBインスタンスはプライマリでの障害発生時の自動フェイルオーバーを提供し、DBインスタンスの可用性を向上させることができる
・スタンバイはホットスタンバイだが、アクセス不可でパフォーマンスには寄与しないため、パフォーマンス向上のためにはリードレプリカの設定が必要

2.2. 2つの読み取り可能なスタンバイを備えた Amazon RDS マルチAZ配置の特徴

・マルチAZ配置のスタンバイ数は原則1であるが、2つの読み取り可能なスタンバイを備えたマルチAZ配置を設定することもできる
・スタンバイが2つあることでフェイルオーバー時の可用性をより向上させるだけでなく、スタンバイを読み取り専用インスタンスとして利用できるためパフォーマンス向上が可能となる
・スタンバイはホットスタンバイであり読み取りアクセス可能のため、リードレプリカを設定することなく可用性とパフォーマンス向上を両立できる

2.3. IAM データベース認証の特徴

・DBへの接続にはユーザIDとパスワードの組み合わせが必要である
・IAMデータベース認証は、IAMユーザやIAMロールへのDBへの接続設定を事前にすることで、パスワードの代わりに一時的な認証トークンを利用してのDB接続を可能にする仕組み
・DB接続が必要なEC2インスタンスやLambda等のAWSサービスにパスワードを持たせる必要がないため、パスワード漏洩、パスワードのメンテ漏れ等のリスクを低減させることができる

3. 検証概要

3.1. 構成図

Lambda関数に、IAMデータベース認証を設定したロールをアタッチして、Amazon RDSにアクセス
※VPCは、デフォルトVPCを使用する
※Private subnet上にDBインスタンスを作成し、同subnet内にLambda関数を配置
構成図は以下の通りです。
image.png

3.2. コスト

利用機能 料金
RDS 2つ読み取り可能なマルチAZ配置 $0.57/h
lambda $0.2/100万リクエスト
Amzon VPC $0.062/h
※本検証は無料枠内で利用

今回検証する、2つ読み取り可能なスタンバイを持つマルチAZ配置ではインスタンス数×インスタンスタイプで利用料金が求められます。また、2つ読み取り可能なスタンバイを持つマルチAZ配置では利用停止が不可能であり、利用を止めたい場合は「削除」する必要があります。

4. 検証

4.1. 環境構築

4.1.1. サブネット作成

「ルートテーブル」を作成
image.png
デフォルトVPCを選択して、任意の名前でルートテーブルを作成
image.png
ルートテーブル作成完了
image.png
デフォルトVPCを選択
image.png
スクロールしてサブネットの設定値を埋めていく
image.png
サブネットを作成
image.png
サブネット作成完了
image.png
アクション>ルートテーブルとの関連付けを編集
image.png
先ほど作成したルートテーブルを選択
image.png
紐づけの編集が完了
image.png
「ルートテーブル」タブに「0.0.0.0/0」が無く、VPC内に閉じた状態(=プライベート)
image.png
今回はマルチAZ配置、スタンバイインスタンス2つを選択するため追加でAZ2つ分のサブネットを作成する必要あり
image.png
RDSインスタンスで利用できるようにサブネットグループを作成
RDS>サブネットグループ>DB サブネットグループの作成 をクリック
image.png
サブネットグループの詳細は任意の値を選択
image.png
AZを複数選択、サブネットも同様に複数選択して「作成」
image.png
サブネットグループ作成完了
image.png

4.1.2. RDSインスタンス作成

RDS>データベース画面から「データベースの作成」をクリック
image.png
データベース作成方法を選択:標準作成、エンジンのオプション:MySQL
image.png
任意のバージョン、テンプレートを選択
image.png
可用性と耐久性:マルチAZ DBクラスター を選択
image.png
以降、以下の画像の通りに設定を行う。
image.png
作成完了
image.png

4.1.3. IAMロールの作成

AmazonRDSDataFullAccess、AWSLambdaBasicExecutionRole、AWSLambdaVPCAccessExecutionRoleを持っているロールを作成し、下記画像のようにカスタムポリシーをアタッチします。
image.png
カスタムポリシーでは、作成したデータベースに対して、検証用ユーザーからのアクセスを許可する内容となっています。

4.2. 検証用lambda関数の設定

4.2.1. lambda関数を作成

「関数名」を記載し、「ランタイム」で「Python 3.13」を選択
image.png
コードを記載し、「Deploy」を押下
image.png
コードは以下の通り

import pymysql
import boto3
import os

def lambda_handler(event, context):
    # RDSインスタンスの情報
    ENDPOINT = "rds-multi-cluster-test-instance-1.cl3jq2kymj5z.ap-northeast-1.rds.amazonaws.com"
    PORT = 3306
    USER = "rds-multi-user1"
    REGION = "ap-northeast-1"
    DBNAME = "mydb"
    SSLCERTIFICATE = "/var/task/ap-northeast-1-bundle.pem"

    # 環境変数の設定
    os.environ['LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN'] = '1'

    # Boto3クライアントの作成
    client = boto3.client('rds', region_name=REGION)

    # 認証トークンの生成
    token = client.generate_db_auth_token(DBHostname=ENDPOINT, Port=PORT, DBUsername=USER, Region=REGION)
    print("token = "+ token)
    # PyMySQLで接続
    try:
        conn = pymysql.connect(
            host=ENDPOINT,
            user=USER,
            password=token,
            port=PORT,
            database=DBNAME,
            ssl={'ca': SSLCERTIFICATE},
            auth_plugin_map={'mysql_clear_password': None}
        )
        print("SUCCESS")
        cur = conn.cursor()
        cur.execute("SELECT 1")
        query_results = cur.fetchall()
        print(query_results)
        return {
            'statusCode': 200,
            'body': query_results
        }
    except Exception as e:
        print(f"Database connection failed due to {e}")
        return {
            'statusCode': 500,
            'body': f"Database connection failed due to {e}"
        }

lambda関数の「New File」に各リージョンに適合するSSL証明書をダウンロードし、アップロードする。
image.png

4.2.2. レイヤーの設定

pipコマンドを使用してpymysqlを所定ディレクトリにインストールする
その後、インストールした「python」フォルダをzip化する​
image.png
「レイヤー」の作成(「pymysql」を使用可能にする)
image.png
「名前」を記載し、「ファイルを選択」から先ほど作成したzipファイルを指定
image.png
「互換性のあるアーキテクチャ」、「互換性のあるランタイム」をlambda関数作成時と同様の値に設定し「作成」を押下
image.png
作成したlambda関数を再度開き、「レイヤーの追加」を押下
image.png
「カスタムレイヤー」を選択し、先ほど作成したレイヤーとバージョンを選択
※バージョンはデフォルトで「1」
image.png
「追加」を押下
image.png
作成したレイヤーが追加されていれば設定完了
image.png

4.2.3. VPCの設定(lambda関数)

Lambda関数編集画面から「設定」→「VPC」→「編集」を押下
image.png
RDSクラスターと同様のVPCを選択
image.png
「サブネット」、「セキュリティグループ」​も同じくRDSクラスターと同様に設定
image.png
「保存」を押下
image.png

4.3. 検証実施・結果

検証実施(資材作成)

前提として、資材作成時にはマスターユーザを利用し、ログイン方法は環境構築時に設定したパスワードを使用します。
image.png
作成したRDSインスタンス内にデータベースを作成する。

CREATE DATABASE mydb;

次に、作成したDBにアクセスするための検証ユーザーを作成
※この時、IAMデータベース認証を用いてアクセスするユーザーとして作成

CREATE USER demouser IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'

ユーザー作成が完了後、ユーザーがデータベースに対して操作を行える権限を付与

cur.execute("GRANT ALL PRIVILEGES ON mydb.* TO 'rds-multi-user1' @'%';");

検証実施(実行結果)

環境構築時に作成したlambda関数を実行します。
また、今回の検証で用いたlambda関数はアクセスできた場合に「1」を返すプログラムとなっています。
以下、実行結果になります。
image.png
実際に「1」が返ってくることが確認できたため、IAMデータベース認証を用いて特定のデータベースにアクセスできることが分かりました。

所感

 lambda関数から2つの読み取り可能なスタンバイを持つRDSマルチAZ配置のデータベースにIAMデータベース認証を持ちいてアクセスすることが確認できました。
 このことから、可用性とパフォーマンスを担保した上で、セキュリティの向上が以前よりも容易に設定することができるようになりました。

参考まとめ

検証対象アップデート情報
Amazon RDS マルチ AZ
Amazon RDSのIAMデータベース認証について
Amazon RDS でのデータベース認証の種類について
IAM 認証を使用した DB インスタンスへの接続方法(公式)
2つの読み取り可能なスタンバイでのIAMデータベース認証設定方法(classmethod)
RDSにIAMデータベース認証でログイン(サーバーワークス)
LambdaでのIAMデータベース認証参考記事
Lambda→RDSへの接続方法参考記事
pymysqlを使用したRDSを使用したAWSLambda
料金 - Amazon RDS | AWS

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?