

# Secrets Manager からシークレットまたはシークレット値を取得する
<a name="dynamic-references-secretsmanager"></a>

Secrets Manager は、データベース認証情報、パスワード、サードパーティー API キーなどのシークレットを安全に保存および管理できるようにするサービスです。Secrets Manager を使用すると、これらのシークレットへのアクセスを一元的に保存および制御できるため、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API 呼び出しに置き換えて、プログラムでシークレットを取得できます。詳細については、「*AWS Secrets Manager ユーザーガイド*」の「[What is AWS Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)」を参照してください。

CloudFormation テンプレート内の Secrets Manager に保存されているシークレット全体またはシークレット値全体を使用するには、`secretsmanager` 動的参照を使用します。

## ベストプラクティス
<a name="dynamic-references-secretsmanager-best-practices"></a>

CloudFormation テンプレートで Secrets Manager の動的参照を使用する場合は、次のベストプラクティスに従ってください。
+ **CloudFormation テンプレートにバージョンレス参照を使用する** – Secrets Manager に認証情報を保存し、適切なシークレットローテーションワークフローをサポートするために `version-stage` または `version-id` パラメータを指定せずに動的参照を使用します。
+ **自動ローテーションの活用** – Secrets Manager の自動ローテーション機能を使用して、認証情報管理のためのバージョンレスの動的参照を行います。これにより、テンプレートを変更することなく、認証情報が定期的に更新されます。詳細については、「[AWS Secrets Manager シークレットのローテーション](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)」を参照してください。
+ **バージョン付き参照の使用は控えめにする** – テストやロールバックなどの特定のシナリオでは、明示的な `version-stage` または `version-id` パラメータのみを指定します。

## 考慮事項
<a name="dynamic-references-secretsmanager-considerations"></a>

`secretsmanager` 動的参照を使用する場合は、次のような重要な考慮事項に留意する必要があります。
+ CloudFormation は、以前のデプロイで使用されたシークレットのバージョンを追跡しません。動的な参照を実装する前に、シークレット管理戦略を慎重に計画してください。可能な場合はバージョンレス参照を使用して、自動シークレットローテーションを活用します。バージョンがない動的参照からバージョン付きの動的参照に移行する場合など、動的参照設定に変更を加えるときは、リソースの更新をモニタリングして検証します。
+ Secrets Manager のシークレット値のみを更新しても、CloudFormation は自動的に新しい値を取得しません。CloudFormation は、リソースの作成時または動的参照を含むリソースを変更する更新時にのみシークレット値を取得します。

  例えば、テンプレートに、`MasterPassword` プロパティが Secrets Manager 動的参照に設定されている [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) リソースが含まれているとします。このテンプレートからスタックを作成したら、Secrets Manager でシークレットの値を更新します。ただし、`MasterPassword` プロパティは古いパスワード値を保持します。

  新しいシークレット値を適用するには、CloudFormation テンプレートで `AWS::RDS::DBInstance` リソースを変更し、スタックの更新を実行する必要があります。

  今後この手動プロセスを回避するには、Secrets Manager を使用してシークレットを自動的にローテーションすることを検討してください。
+ `secretsmanager` などの安全な値の動的参照は、現在カスタムリソースではサポートされていません。
+ `secretsmanager` の動的な参照は、すべてのリソースプロパティで使用できます。`secretsmanager` の動的な参照を使用することは、Secrets Manager ログも CloudFormation ログも解決済みのシークレットの値を保持してはならないことを示します。ただし、シークレット値は、それが使用されているリソースを持つサービスに表示されることがあります。シークレットデータが漏れるのを防ぐために、使用方法を確認します。

## アクセス許可
<a name="dynamic-references-secretsmanager-permissions"></a>

Secrets Manager に保存されているシークレットを指定するには、シークレットに対して [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) を呼び出すためのアクセス許可が必要です。

## リファレンスパターン
<a name="dynamic-references-secretsmanager-pattern"></a>

CloudFormation テンプレートで Secrets Manager シークレットを参照するには、次の `secretsmanager` 参照パターンを使用します。

```
{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
```

`secret-id`  
シークレット名またはシークレット ARN。  
AWS アカウントのシークレットにアクセスするには、シークレット名を指定するだけです。別の AWS アカウントのシークレットにアクセスするには、そのシークレットの完全な ARN を指定します。  
必須。

`secret-string`  
`SecretString` はサポートされる唯一の値です。デフォルトは `SecretString` です。

`json-key`  
値を取得するペアのキー名を指定します。`json-key` を指定しない場合、CloudFormation はシークレットテキスト全体を取得します。  
このセグメントにはコロン文字 (`:`) を含めることはできません。

`version-stage`  
使用するシークレットのバージョンのステージングラベル。シークレットマネージャーは、ステージングラベルがローテーション処理中にさまざまなバージョンを追跡するために使用されます。`version-stage` を使用する場合は、`version-id` を指定することはできません。`version-stage` または `version-id`、を指定しない場合、デフォルトでは `AWSCURRENT` というラベルの付いたバージョンが取得されます。  
このセグメントにはコロン文字 (`:`) を含めることはできません。

`version-id`  
使用したいシークレットのバージョンの固有識別子を指定します。`version-id` を指定した場合は、`version-stage` を指定しないでください。`version-stage` または `version-id` を指定しない場合、次にデフォルトでは `AWSCURRENT` というバージョンが取得されます。  
このセグメントにはコロン文字 (`:`) を含めることはできません。

## 例
<a name="dynamic-references-secretsmanager-examples"></a>

**Topics**
+ [シークレットからユーザー名とパスワードの値を取得する](#dynamic-references-secretsmanager-examples-user-name-and-password)
+ [SecretString 全体を取得する](#dynamic-references-secretsmanager-examples-entire-secretstring)
+ [シークレットの特定のバージョンから値を取得する](#dynamic-references-secretsmanager-examples-specific-version)
+ [別の AWS アカウントからシークレットを取得する](#dynamic-references-secretsmanager-examples-secrets-from-another-account)

### シークレットからユーザー名とパスワードの値を取得する
<a name="dynamic-references-secretsmanager-examples-user-name-and-password"></a>

次の [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) の例では、`MySecret` に保存されているユーザー名とパスワードの値を取得します。この例では、バージョンレスの動的参照に推奨されるパターンを示します。このパターンは、`AWSCURRENT` バージョンを自動的に使用し、テンプレートの変更を必要とせずに Secrets Manager のローテーションワークフローをサポートします。

#### JSON
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.json"></a>

```
{
    "MyRDSInstance": {
        "Type": "AWS::RDS::DBInstance",
        "Properties": {
            "DBName": "MyRDSInstance",
            "AllocatedStorage": "20",
            "DBInstanceClass": "db.t2.micro",
            "Engine": "mysql",
            "MasterUsername": "{{resolve:secretsmanager:MySecret:SecretString:username}}",
            "MasterUserPassword": "{{resolve:secretsmanager:MySecret:SecretString:password}}"
        }
    }
}
```

#### YAML
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.yaml"></a>

```
  MyRDSInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MyRDSInstance
      AllocatedStorage: '20'
      DBInstanceClass: db.t2.micro
      Engine: mysql
      MasterUsername: '{{resolve:secretsmanager:MySecret:SecretString:username}}'
      MasterUserPassword: '{{resolve:secretsmanager:MySecret:SecretString:password}}'
```

### SecretString 全体を取得する
<a name="dynamic-references-secretsmanager-examples-entire-secretstring"></a>

次の動的リファレンスは、 `MySecret` の `SecretString` を取得します。

```
{{resolve:secretsmanager:MySecret}}
```

または:

```
{{resolve:secretsmanager:MySecret::::}}
```

### シークレットの特定のバージョンから値を取得する
<a name="dynamic-references-secretsmanager-examples-specific-version"></a>

次の動的リファレンスは、 `MySecret` の `AWSPREVIOUS` バージョンの `password` 値を取得します。

```
{{resolve:secretsmanager:MySecret:SecretString:password:AWSPREVIOUS}}
```

### 別の AWS アカウントからシークレットを取得する
<a name="dynamic-references-secretsmanager-examples-secrets-from-another-account"></a>

次の動的リファレンスは、別の AWS アカウントにある `MySecret` の `SecretString` を取得します。別の AWS アカウントのシークレットにアクセスするには、完全なシークレット ARN を指定する必要があります。

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}
```

次の動的リファレンスは、別の AWS アカウントにある `MySecret` の `password` 値を取得します。別の AWS アカウントのシークレットにアクセスするには、完全なシークレット ARN を指定する必要があります。

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}
```