

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Data Lifecycle Manager の事前スクリプトと事後スクリプトのその他のユースケース
<a name="script-other-use-cases"></a>

事前スクリプトと事後スクリプトを使用してアプリケーション整合性のあるスナップショットを自動化するだけでなく、事前スクリプトと事後スクリプトを一緒に、または個別に使用して、スナップショット作成前または作成後の他の管理タスクを自動化できます。例えば、次のようになります。
+ スナップショットを作成する前に、事前スクリプトを使用してパッチを適用します。これにより、毎週または毎月の定期的なソフトウェアアップデートを適用した後にスナップショットを作成できます。
**注記**  
事前スクリプトのみを実行することを選択した場合は、**[Crash-consistent スナップショットをデフォルトで作成]** がデフォルトで有効になります。
+ スナップショットを作成した後に、事後スクリプトを使用してパッチを適用します。これにより、毎週または毎月の定期的なソフトウェアアップデートを適用する前にスナップショットを作成できます。

## 他のユースケースで使用を開始する
<a name="dlm-script-other"></a>

このセクションでは、**アプリケーション整合性のあるスナップショット以外のユースケース**で事前スクリプトまたは事後スクリプトを使用する場合に実行する必要がある手順について説明します。

### ステップ 1: ターゲットインスタンスを準備する
<a name="dlm-script-other-prep-instance"></a>

**ターゲットインスタンスを事前スクリプトまたは事後スクリプト用に準備するには**

1. SSM Agent がまだインストールされていない場合は、ターゲットインスタンスにインストールします。SSM Agent がターゲットインスタンスに既にインストールされている場合は、このステップをスキップしてください。
   + (Linux インスタンス) [Linux 用 EC2 インスタンスに SSM Agent を手動でインストールおよびアンインストールする](https://docs.aws.amazon.com/systems-manager/latest/userguide/manually-install-ssm-agent-linux.html)
   + (Windows インスタンス) [Windows Server 用 EC2 インスタンスで SSM Agent を使用する](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent-windows.html)

1. SSM Agent が実行中であることを確認します。詳細については、「[SSM Agent ステータスの確認とエージェントの起動](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent-status-and-restart.html)」を参照してください。

1. Systems Manager の Amazon EC2 インスタンスをセットアップします。詳細については、「*AWS Systems Manager ユーザーガイド*」の「[Systems Manager を利用した EC2 インスタンスの管理](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-setting-up-ec2.html)」を参照してください。

### ステップ 2: SSM ドキュメントを準備する
<a name="dlm-script-other-prep-document"></a>

実行するコマンドを使った事前スクリプトまたは事後スクリプトを含む SSM コマンドドキュメントを作成する必要があります。

以下の空の SSM ドキュメントテンプレートを使用して SSM ドキュメントを作成し、事前スクリプトコマンドと事後スクリプトコマンドを該当するドキュメントセクションに追加できます。

**次の点に注意してください。**  
SSM ドキュメントがユーザーのワークロードに対して適切かつ必要なアクションを実行していることを確認するのは、ユーザーの責任になります。
SSM ドキュメントには、`pre-script`、`post-script`、`dry-run` などの `allowedValues` の必須フィールドが含まれている必要があります。Amazon Data Lifecycle Manager は、これらのセクションのコンテンツに基づいてインスタンス上でコマンドを実行します。SSM ドキュメントにこれらのセクションがない場合、Amazon Data Lifecycle Manager は、そのドキュメントを実行に失敗したものとして扱います。

```
###===============================================================================###
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

# Permission is hereby granted, free of charge, to any person obtaining a copy of this
# software and associated documentation files (the "Software"), to deal in the Software
# without restriction, including without limitation the rights to use, copy, modify,
# merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
###===============================================================================###
schemaVersion: '2.2'
description: SSM Document Template for Amazon Data Lifecycle Manager Pre/Post script feature
parameters:
  executionId:
    type: String
    default: None
    description: (Required) Specifies the unique identifier associated with a pre and/or post execution
    allowedPattern: ^(None|[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$
  command:
  # Data Lifecycle Manager will trigger the pre-script and post-script actions during policy execution. 
  # 'dry-run' option is intended for validating the document execution without triggering any commands
  # on the instance. The following allowedValues will allow Data Lifecycle Manager to successfully 
  # trigger pre and post script actions.
    type: String
    default: 'dry-run'
    description: (Required) Specifies whether pre-script and/or post-script should be executed.
    allowedValues:
    - pre-script
    - post-script
    - dry-run

mainSteps:
- action: aws:runShellScript
  description: Run Database freeze/thaw commands
  name: run_pre_post_scripts
  precondition:
    StringEquals:
    - platformType
    - Linux
  inputs:
    runCommand:
    - |
      #!/bin/bash

      ###===============================================================================###
      ### Error Codes
      ###===============================================================================###
      # The following Error codes will inform Data Lifecycle Manager of the type of error 
      # and help guide handling of the error. 
      # The Error code will also be emitted via AWS Eventbridge events in the 'cause' field.
      # 1 Pre-script failed during execution - 201
      # 2 Post-script failed during execution - 202
      # 3 Auto thaw occurred before post-script was initiated - 203
      # 4 Pre-script initiated while post-script was expected - 204
      # 5 Post-script initiated while pre-script was expected - 205
      # 6 Application not ready for pre or post-script initiation - 206

      ###===============================================================================###
      ### Global variables
      ###===============================================================================###
      START=$(date +%s)
      # For testing this script locally, replace the below with OPERATION=$1.
      OPERATION={{ command }}

      # Add all pre-script actions to be performed within the function below
      execute_pre_script() {
          echo "INFO: Start execution of pre-script"
      }

      # Add all post-script actions to be performed within the function below
      execute_post_script() {
          echo "INFO: Start execution of post-script"
      }

      # Debug logging for parameters passed to the SSM document
      echo "INFO: ${OPERATION} starting at $(date) with executionId: ${EXECUTION_ID}"

      # Based on the command parameter value execute the function that supports 
      # pre-script/post-script operation
      case ${OPERATION} in
          pre-script)
              execute_pre_script
              ;;
          post-script)
              execute_post_script
              ;;
          dry-run)
              echo "INFO: dry-run option invoked - taking no action"
              ;;
          *)
              echo "ERROR: Invalid command parameter passed. Please use either pre-script, post-script, dry-run."
              exit 1 # return failure
              ;;
      esac

      END=$(date +%s)
      # Debug Log for profiling the script time
      echo "INFO: ${OPERATION} completed at $(date). Total runtime: $((${END} - ${START})) seconds."
```

### ステップ 3: Amazon Data Lifecycle Manager の IAM ロールを準備する
<a name="dlm-script-other-prep-role"></a>

**注記**  
このステップは次の場合に必要です。  
カスタム IAM ロールを使用する、事前/事後スクリプト対応のスナップショットポリシーを作成または更新します。
コマンドラインを使用して、デフォルトを使用する、事前/事後スクリプト対応のスナップショットポリシーを作成または更新します。
コンソールを使用して、スナップショットを管理するためのデフォルトロール (**AWSDataLifecycleManagerDefaultRole**) を使用する、事前/事後スクリプト対応のスナップショットポリシーを作成または更新する場合は、このステップをスキップしてください。この場合、**AWSDataLifecycleManagerSSMFullAccess** ポリシーが自動的にそのロールにアタッチされます。

ポリシーに使用するその IAM ロールが、ポリシーのターゲットとなるインスタンスで事前スクリプトと事後スクリプトを実行するために必要な SSM アクションを実行する権限を Amazon Data Lifecycle Manager に付与していることを確認する必要があります。

Amazon Data Lifecycle Manager には、必要なアクセス許可を含むマネージドポリシー (**AWSDataLifecycleManagerSSMFullAccess**) が用意されています。スナップショットを管理するための IAM ロールにこのポリシーをアタッチすると、確実にアクセス許可を含めることができます。

**重要**  
AWSDataLifecycleManagerSSMFullAccess マネージドポリシーでは、事前スクリプトと事後スクリプトを使用するときに、`aws:ResourceTag` 条件キーを使って特定の SSM ドキュメントへのアクセスを制限します。Amazon Data Lifecycle Manager が SSM ドキュメントにアクセスできるようにするには、SSM ドキュメントに `DLMScriptsAccess:true` のタグが付けられていることを確認する必要があります。

あるいは、カスタムポリシーを手動で作成するか、使用する IAM ロールに必要なアクセス許可を直接割り当てることもできます。AWSDataLifecycleManagerSSMFullAccess マネージドポリシーで定義されているのと同じアクセス許可を使用できますが、`aws:ResourceTag` 条件キーはオプションです。この条件キーを使用しない場合は、SSM ドキュメントに `DLMScriptsAccess:true` のタグを付ける必要はありません。

以下のいずれかの方法を使用して、**AWSDataLifecycleManagerSSMFullAccess** ポリシーを IAM ロールに追加します。

------
#### [ Console ]

**マネージドポリシーをカスタムロールにアタッチするには**

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で IAM コンソールを開きます。

1. ナビゲーションパネルで [**Roles (ロール) **] を選択します。

1. スナップショットを管理するためのカスタムロールを検索し、選択します。

1. **[アクセス許可]** タブで、**[アクセス許可の追加]**、**[ポリシーをアタッチ]** の順に選択します。

1. **[AWSDataLifecycleManagerSSMFullAccess]** マネージドポリシーを検索して選択し、**[アクセス許可の追加]** を選択します。

------
#### [ AWS CLI ]

**マネージドポリシーをカスタムロールにアタッチするには**  
[attach-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html) コマンドを使用します。`---role-name` には、カスタムロールの名前を指定します。`--policy-arn` の場合、`arn:aws:iam::aws:policy/AWSDataLifecycleManagerSSMFullAccess` を指定します。

```
$ aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AWSDataLifecycleManagerSSMFullAccess \
--role-name your_role_name
```

------

### スナップショットライフサイクルポリシーを作成する
<a name="dlm-script-other-prep-policy"></a>

------
#### [ Console ]

**スナップショットライフサイクルポリシーを作成するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで、[**Elastic Block Store**]、[**ライフサイクルマネージャー**]、[**ライフサイクルポリシーの作成**] の順に選択します。

1. リポジトリの [**ポリシータイプの選択**] 画面で、[**EBS スナップショットポリシー**] を選択し、[**次へ**] をクリックします。

1. **[Target resources]** (ターゲットリソース) セクションで、以下の操作を行います。

   1. **[ターゲットリソースタイプ]** で、[`Instance`] を選択します。

   1. **[ターゲットリソースタグ]** で、バックアップするインスタンスを識別するリソースタグを指定します。指定したタグを持つリソースのみがバックアップされます。

1. **[IAM ロール]** には、**AWSDataLifecycleManagerDefaultRole** (スナップショットを管理するためのデフォルトロール) を選択するか、事前スクリプトおよび事後スクリプト用に作成して準備したカスタムロールを選択します。

1. 必要に応じて、スケジュールと追加のオプションを設定します。メンテナンスウィンドウ中など、ワークロードに合った期間にスナップショット作成時刻をスケジュールすることをお勧めします。

1. **[事前スクリプトと事後スクリプト]** セクションで、**[事前スクリプトと事後スクリプトを有効にする]** を選択し、次の操作を行います。

   1. **[カスタム SSM ドキュメント]** を選択します。

   1. **[自動化]** オプションで、実行するスクリプトに一致するオプションを選択します。

   1. **[SSM ドキュメント]** に、準備した SSM ドキュメントを選択します。

1. 必要に応じて、次の追加オプションを設定します。
   + **[スクリプトタイムアウト]** — Amazon Data Lifecycle Manager がスクリプトの実行試行を完了していない場合に、その試行が失敗するまでのタイムアウト期間。スクリプトがタイムアウト期間内に完了しない場合、Amazon Data Lifecycle Manager はその試行に失敗します。タイムアウト期間は、事前スクリプトと事後スクリプトに個別に適用されます。デフォルトのタイムアウト期間は 10 秒です。また、最大タイムアウト期間は 120 秒です。
   + **[失敗したスクリプトの再試行]** — タイムアウト期間内に完了しなかったスクリプトを再試行する場合は、このオプションを選択します。事前スクリプトが失敗した場合、Amazon Data Lifecycle Manager は、事前スクリプトと事後スクリプトの実行を含め、スナップショット作成プロセス全体を再試行します。事後スクリプトが失敗した場合、Amazon Data Lifecycle Manager は、事後スクリプトのみを再試行します。この場合、事前スクリプトは完了し、スナップショットが作成された可能性があります。
   + **Crash-consistent スナップショットをデフォルトで作成** – このオプションを選択すると、事前スクリプトの実行に失敗した場合に、Crash-consistent スナップショットがデフォルトで作成されます。これは、事前スクリプトと事後スクリプトが有効になっていない場合の、Amazon Data Lifecycle Manager のデフォルトのスナップショット作成動作です。再試行を有効にした場合、Amazon Data Lifecycle Manager は、再試行回数をすべて使い切った後にのみ、Crash-consistent スナップショットをデフォルトで作成します。事前スクリプトが失敗し、Crash-consistent スナップショットがデフォルトで作成されなかった場合、Amazon Data Lifecycle Manager は、そのスケジュールの実行中にインスタンスのスナップショットを作成しません。

1. **[デフォルトポリシーの作成]** を選択します。
**注記**  
`Role with name AWSDataLifecycleManagerDefaultRole already exists` エラーが発生した場合、詳細については「[Amazon Data Lifecycle Manager の問題のトラブルシューティング](dlm-troubleshooting.md)」を参照してください。

------
#### [ AWS CLI ]

**スナップショットライフサイクルポリシーを作成するには**  
[create-lifecycle-policy](https://docs.aws.amazon.com/cli/latest/reference/dlm/create-lifecycle-policy.html) コマンドを使用して、`CreateRule` に `Scripts` パラメータを含めます。パラメータの詳細については、「[https://docs.aws.amazon.com/dlm/latest/APIReference/API_Script.html](https://docs.aws.amazon.com/dlm/latest/APIReference/API_Script.html)」を参照してください。

```
$ aws dlm create-lifecycle-policy \
--description "policy_description" \
--state ENABLED \
--execution-role-arn iam_role_arn \
--policy-details file://policyDetails.json
```

ここで `policyDetails.json` には以下が含まれます。

```
{
    "PolicyType": "EBS_SNAPSHOT_MANAGEMENT",
    "ResourceTypes": [
        "INSTANCE"
    ],
    "TargetTags": [{
        "Key": "tag_key",
        "Value": "tag_value"
    }],
    "Schedules": [{
        "Name": "schedule_name",
        "CreateRule": {
            "CronExpression": "cron_for_creation_frequency", 
            "Scripts": [{ 
                "Stages": ["PRE" | "POST" | "PRE","POST"],
                "ExecutionHandlerService":"AWS_SYSTEMS_MANAGER",
                "ExecutionHandler":"ssm_document_name|arn",
                "ExecuteOperationOnScriptFailure":true|false,
                "ExecutionTimeout":timeout_in_seconds (10-120), 
                "MaximumRetryCount":retries (0-3)
            }]
        },
        "RetainRule": {
            "Count": retention_count
        }
    }]
}
```

------