my opinion is my own

IAM認証を使用したAurora(PostgreSQL)への接続

IAMデータベース認証の有効化

マネージメントコンソール、もしくは下記コマンドで有効化する

aws rds modify-db-cluster --db-cluster-identifier aurorapgsqlv1 --apply-immediately --enable-iam-database-authentication

IAMデータベース認証が有効になっているか確認

aws rds describe-db-clusters --db-cluster-identifier aurorapgsqlv1 --query 'DBClusters[].[IAMDatabaseAuthenticationEnabled]' --output table

IAMデータベース認証用のPostgreSQLユーザを作成

rds_iamは固定。

CREATE USER iam_user WITH LOGIN;
grant rds_iam to iam_user;

IAMポリシーを作成

AWS CLIから作成するのでiam_rds_connect.jsonを作成

cat << EOF > iam_rds_connect.json  
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:ap-northeast-1:xxxxxxxxxxx:dbuser:cluster-ALPQLYUXTQZEQ7M7F5UBRC7WTU/iam_user"
         ]
      }
   ]
}
EOF

Resource箇所でリージョン、アカウントID、クラスタID、PostgreSQLのユーザ名を指定。

クラスタIDは下記CLIで確認が可能。

aws rds describe-db-clusters --db-cluster-identifier aurorapgsqlv1 --query "DBClusters[0].[DbClusterResourceId]"

IAMポリシーを作成

aws iam create-policy --policy-name iam_rds_connect --policy-document file://iam_rds_connect.json 
[ec2-user@bastin ~]$ aws iam create-policy --policy-name iam_rds_connect --policy-document file://iam_rds_connect.json 
{
    "Policy": {
        "PolicyName": "iam_rds_connect", 
        "PermissionsBoundaryUsageCount": 0, 
        "CreateDate": "2020-06-21T10:50:56Z", 
        "AttachmentCount": 0, 
        "IsAttachable": true, 
        "PolicyId": "ANPAR23YLZYEHAKGAXPDT", 
        "DefaultVersionId": "v1", 
        "Path": "/", 
        "Arn": "arn:aws:iam::xxxxxxxxxxx:policy/iam_rds_connect", 
        "UpdateDate": "2020-06-21T10:50:56Z"
    }
}
[ec2-user@bastin ~]$ 

IAMユーザがAdministratorAccessのように強い権限を所持していたらここまででOKで、権限を絞っているのであればIAM ユーザーまたはロールへの IAM ポリシーのアタッチが必要となる。

IAM データベースアクセス用の IAM ポリシーの作成と使用 - Amazon Aurora https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html

IAMデータベースを使用したAurora PostgreSQLへの接続

認証情報は aws rds generate-db-auth-tokenで取得可能。PostgreSQLへの接続時には環境変数のPGPASSWORDに変数として入れる。認証トークンは数百の文字で構成されて長いので、コピペしてログインよりもこちらの方法の方がスマート。

export PGPASSWORD=`aws --region ap-northeast-1 rds generate-db-auth-token --hostname aurorapgsqlv1.cluster-xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port 5432 --username iam_user`
psql -h aurorapgsqlv1.cluster-xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U iam_user -d postgres
成功パターン
[ec2-user@bastin ~]$ export PGPASSWORD=`aws --region ap-northeast-1 rds generate-db-auth-token --hostname aurorapgsqlv1.cluster-xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port 5432 --username iam_user`
[ec2-user@bastin ~]$ psql -h aurorapgsqlv1.cluster-xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U iam_user -d postgres
psql (11.5, server 11.7)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> select version();
                                   version                                   
-----------------------------------------------------------------------------
 PostgreSQL 11.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.9.3, 64-bit
(1 row)

postgres=> select aurora_version();
 aurora_version 
----------------
 3.2.1
(1 row)
失敗パターン
[ec2-user@bastin ~]$ psql -h aurorapgsqlv1.cluster-xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U iam_user -d postgres
psql: FATAL:  password authentication failed for user "iam_user"
FATAL:  password authentication failed for user "iam_user"

最後に

RDS(Aurora含む)への接続時の認証は他にもSystems Manager パラメータストアやSecrets Manager等、色々あってどれを使うべきか迷う、、。IAM認証に関してその他の注意事項等はマニュアルを参照。データベースクラスターの 1 秒あたりの最大接続数は、クラスタータイプとワークロードに応じて制限される場合があります。と記載あるのが個人的には気になるところ。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.IAMDBAuth.html

IAM データベース認証の MySQL の制限事項 IAM データベース認証の PostgreSQL の制限事項

---

関連しているかもしれない記事


#AWS #Aurora #PostgreSQL