本日も乙

ただの自己満足な備忘録。

Amazon Redshift クラスタをリストアするときのIAM権限について注意が必要

小ネタです。
Redshift クラスタをリストアしたい要望があったので、専用のIAMロールと権限を付与したのですが、Permission Deniedになってしまったので、原因調査と解決までしたので記事にしました。

やりたかったこと

以下のコマンドでリストアするつもりでした。

$ aws redshift restore-from-cluster-snapshot \
--region ap-northeast-1 \
--cluster-identifier restore-redshift \
--iam-roles arn:aws:iam::123456789012:role/redshift-role \    # Redshift クラスタにIAMロールを付与
--snapshot-identifier rs:foo-redshift-2018-02-14-00-58-09 \
--port 5439 \
--no-allow-version-upgrade \
--cluster-subnet-group-name foo-subnet \
--publicly-accessible \
--cluster-parameter-group-name foo-paramter \
--vpc-security-group-ids sg-xxxxxxxx \
--automated-snapshot-retention-period 0 \
--node-type dc1.large \
--no-enhanced-vpc-routing

IAMロールには redshift:RestoreFromClusterSnapshot のみを付与して実行したところ、

An error occurred (UnauthorizedOperation) when calling the RestoreFromClusterSnapshot operation: Access Denied. Please ensure that your IAM Permissions allow this operation.

とエラーになってしまいました。
IAM Permissions だったので、IAMロールを付与するのに iam:PassRole が必要なことに気づいて追加して再実行すると今度は

An error occurred (UnauthorizedOperation) when calling the RestoreFromClusterSnapshot operation: Access Denied. Please ensure that your IAM Permissions allow this operation.

となってしまいました。
RestoreFromClusterSnapshot を許可しとるやないか!

散々調べたり検証した結果、以下のような権限で動作することが判明しました。

必要だったIAM権限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "redshift:DescribeClusters",
                "redshift:DescribeClusterSnapshots",
                "redshift:RestoreFromClusterSnapshot",
                "redshift:ModifyCluster*",
                "redshift:DescribeClusterSubnetGroups",
                "redshift:DescribeClusterSecurityGroups",
                "redshift:DescribeClusterParameterGroups",
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAddresses",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeVpcs",
                "iam:PassRole"
            ],
            "Resource": "*"
        }
    ]
}

ハマったポイント
1. IAMロールを付与するので iam:PassRole が必要(上記の通り) 2. VPC内にRedshiftクラスタをリストアするので、 VPCやSubnet、AZなどの権限も必要 3. RedshiftクラスタのParameterGroupなどを変更するので redshift:ModifyCluster が必要

まとめ

Redshiftクラスタをリストアしようとしたときには権限に注意が必要でした。ドキュメントを探しても見つからなかったので同じところでハマっている人がいれば参考になれば幸いです。てか、ドキュメントに書いとけよとですよね・・・