Redshift Serverlessのスケジュールスナップショット機能を試す

先日のre:InventにてRedshift Serverlessに関する[管理機能のアップデート](URL "https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-redshift-serverless-manageability-usability-features/")がありました。
地味に嬉しい機能がいくつかありますが、ここではスケジュールスナップショット機能を試してみます。
2023/12現在、[スケジュールスナップショット機能](URL "https://docs.aws.amazon.com/general/latest/gr/redshift-service.html")の設定はマネジメントコンソール非対応のため、AWS CLIで設定を進めます。

AWS CLIのバージョン
-------------------

最新版のAWS CLIを使用します。

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/2.14.5 Python/3.11.6 Darwin/23.1.0 exe/x86_64 prompt/off


IAMポリシーとロールの作成
-----------------------
スケジュールの管理に必要なIAMポリシーとIAMロールを作成します。


redshiftschedulerpolicy(例):
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "redshift-serverless:GetScheduledAction",
                "redshift-serverless:CreateScheduledAction",
                "redshift-serverless:DeleteScheduledAction",
                "redshift-serverless:UpdateScheduledAction",
                "redshift-serverless:ListScheduledActions",
                "redshift-serverless:CreateSnapshot"
            ],
            "Resource": "*"
        }
    ]
}
```


続いてIAMロールを作成します。
信頼ポリシーは下記の内容で設定します。

redshiftschedulerrole(例):
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "scheduler.redshift.amazonaws.com",
                    "redshift-serverless.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

最後に作成したIAMポリシーをIAMロールに紐づけます。
作成したIAMロールはスケジュール作成時に使用しますので、IAMロールのrolearnを控えておきましょう。


スナップショットスケジュール作成
-----------------------
スナップショットスケジュールは[cron式](URL"https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-cron-expressions.html")で設定します。
ここでは毎日17:00(JST)取得するスケジュールとします。cron式はUTC基準のためJSTから-9hで設定します。
作成したIAMロールのrolearnに置き換えてください。


```bash:コマンド:
aws redshift-serverless create-scheduled-action --enabled \
  --namespace-name namespace \
  --role-arn arn:aws:iam::xxxx:role/redshiftschedulerrole \
  --scheduled-action-name everyday1700 \
  --schedule "cron=(0 8 * * ? *)" \
  --target-action '{"createSnapshot": {"namespaceName": "namespace","snapshotNamePrefix": "samplesnapshot", "retentionPeriod": 7}}'

```

結果(例):
```
{
    "scheduledAction": {
        "namespaceName": "namespace",
        "roleArn": "arn:aws:iam::xxxxxx1:role/redshiftschedulerrole",
        "schedule": {
            "cron": "0 8 * * ? *"
        },
        "scheduledActionName": "everyday1700",
        "scheduledActionUuid": "xxxxxxx",
        "state": "ACTIVE",
        "targetAction": {
            "createSnapshot": {
                "namespaceName": "namespace",
                "retentionPeriod": 7,
                "tags": []
            }
        }
    }
}
```

これでスケジュールの設定は完了です。

マネジメントコンソールで確認
-----------------------
指定した時刻でスナップショットを取得できていることが確認できました。

![スクリーンショット 2023-12-08 18.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/1bb05c23-602a-0edb-d6eb-e518b9c3a4e3.png)


おそうじ
-----------------------
最後に作成したスナップショットスケジュールを削除します。

```bash:コマンド:
aws redshift-serverless delete-scheduled-action --scheduled-action-name everyday1700

```

結果(例):
```
{
    "scheduledAction": {
        "namespaceName": "namespace",
        "roleArn": "arn:aws:iam::xxxxxx:role/redshiftschedulerrole",
        "schedule": {
            "cron": "0 8 * * ? *"
        },
        "scheduledActionName": "everyday1700",
        "scheduledActionUuid": "xxxxx",
        "state": "ACTIVE",
        "targetAction": {
            "createSnapshot": {
                "namespaceName": "namespace",
                "retentionPeriod": 7,
                "tags": []
            }
        }
    }
}
```

スナップショット自体の削除も忘れないようにしておきましょう。

まとめ
-----------------------
今まではEventBridge等を活用してスナップショットスケジュールを個別に作り込む必要がありましたが、Redshift Serverlessの機能だけで簡単にスケジュール管理ができるようになったのは嬉しいですね。
同時にリリースされたクロスリージョンコピーとの併用も可能で、スケジュールで別リージョンにスナップショットを作成できることも可能です。
マネジメントコンソール非対応な点だけ少し不便なため、Redshiftと同様にマネジメントコンソールでのスケジュール設定機能に期待です。