AWS KMSキーのテンプレート

# AWS KMSキーのテンプレート
この記事では、AWS CloudFormationテンプレート（template.yaml）とAWS SAMのデプロイ設定ファイル（samconfig.toml）を使って、AWS Key Management Service（KMS）キーを作成し、そのエイリアスを設定する方法を解説します。

## 1. CloudFormationテンプレート (template.yaml)
以下は、CloudFormationでKMSキーを作成するテンプレートです。

全体構成
```template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Create a KMS Key with specific policies and an alias

Resources:
  MyKMSKey:
    Type: AWS::KMS::Key
    Properties:
      Description: "My KMS Key"
      KeyPolicy:
        Version: "2012-10-17"
        Id: "key-consolepolicy-3"
        Statement:
          - Sid: "Enable IAM User Permissions"
            Effect: "Allow"
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
            Action: "kms:*"
            Resource: "*"
          - Sid: "Allow access for Key Administrators"
            Effect: "Allow"
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:role/AdminRole"
            Action:
              - "kms:Create*"
              - "kms:Describe*"
              - "kms:Enable*"
              - "kms:List*"
              - "kms:Put*"
              - "kms:Update*"
              - "kms:Revoke*"
              - "kms:Disable*"
              - "kms:Get*"
              - "kms:Delete*"
              - "kms:TagResource"
              - "kms:UntagResource"
              - "kms:ScheduleKeyDeletion"
              - "kms:CancelKeyDeletion"
            Resource: "*"
          - Sid: "Allow use of the key"
            Effect: "Allow"
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:role/AdminRole"
            Action:
              - "kms:Encrypt"
              - "kms:Decrypt"
              - "kms:ReEncrypt*"
              - "kms:GenerateDataKey*"
              - "kms:DescribeKey"
            Resource: "*"
          - Sid: "Allow attachment of persistent resources"
            Effect: "Allow"
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:role/AdminRole"
            Action:
              - "kms:CreateGrant"
              - "kms:ListGrants"
              - "kms:RevokeGrant"
            Resource: "*"
            Condition:
              Bool:
                kms:GrantIsForAWSResource: "true"
          - Sid: "Allow Eventbridge"
            Effect: "Allow"
            Principal:
              Service: "events.amazonaws.com"
            Action:
              - "kms:GenerateDataKey"
              - "kms:Decrypt"
            Resource: "*"

  MyKMSKeyAlias:
    Type: AWS::KMS::Alias
    Properties:
      # エイリアス名を指定
      AliasName: "alias/key-sns"
      # 作成したKMSキーをターゲットに設定
      TargetKeyId: !Ref MyKMSKey

Outputs:
  KMSKeyId:
    Description: "KMS Key ID"
    Value: !Ref MyKMSKey
  KMSKeyAlias:
    Description: "KMS Key Alias"
    Value: !Sub "alias/key-sns"
```

このテンプレートでは、以下のリソースを定義しています
MyKMSKey: AWS KMSキー
MyKMSKeyAlias: KMSキーのエイリアス
Outputs: 作成されたKMSキーとエイリアスのIDを出力
MyKMSKey
プロパティの解説

```yaml
  MyKMSKey:
    Type: AWS::KMS::Key
    Properties:
      Description: "My KMS Key"
      KeyPolicy:
        ...
```
Description: KMSキーの説明。後からAWSコンソールで確認する際に役立ちます。
KeyPolicy: KMSキーのポリシーを定義。詳細は以下で解説します。
KeyPolicy
KMSキーのアクセス権限を設定する重要な部分です。

```yaml
- Sid: "Enable IAM User Permissions"
  Effect: "Allow"
  Principal:
    AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
  Action: "kms:*"
  Resource: "*"
```

Enable IAM User Permissions: ルートユーザー（arn:aws:iam::${AWS::AccountId}:root）に完全な権限を付与。
その他、以下のポリシーを定義しています：

Allow access for Key Administrators: 特定のIAMロール（AdminRole）にKMSキーの作成・更新・削除権限を付与。
Allow use of the key: KMSキーの暗号化や復号化など、データ操作に関する権限をAdminRoleに付与。
Allow attachment of persistent resources: KMSキーと他のAWSリソース（例: S3バケット）を結びつける権限を付与。
Allow Eventbridge: Amazon EventBridgeサービスにデータキーの生成や復号化を許可。
MyKMSKeyAlias

```yaml
  MyKMSKeyAlias:
    Type: AWS::KMS::Alias
    Properties:
      AliasName: "alias/key-sns"
      TargetKeyId: !Ref MyKMSKey
```
    
AliasName: エイリアス名。簡潔で意味が伝わりやすい名前を推奨します（例: alias/key-sns）。
TargetKeyId: 作成したKMSキーのIDを参照。
Outputs

```yaml
Outputs:
  KMSKeyId:
    Description: "KMS Key ID"
    Value: !Ref MyKMSKey
  KMSKeyAlias:
    Description: "KMS Key Alias"
    Value: !Sub "alias/key-sns"
```
    
CloudFormationのスタック出力として、以下を提供します：

KMSKeyId: KMSキーのユニークID
KMSKeyAlias: エイリアス名（alias/key-sns）
2. SAMデプロイ設定 (samconfig.toml)
AWS SAM（Serverless Application Model）でこのテンプレートをデプロイするための設定ファイルです。

samconfig.tomlの内容
```toml
version = 0.1
[default.deploy.parameters]
stack_name = "key-sns"
region = "ap-northeast-1"
s3_bucket = "samdeploy-bucket"
capabilities = "CAPABILITY_NAMED_IAM"
```

各パラメータの説明
version: 設定ファイルのバージョン。常に0.1を指定。
stack_name: デプロイ時に作成されるCloudFormationスタックの名前。ここではkey-sns。
region: デプロイ先のAWSリージョン。例: ap-northeast-1（東京リージョン）。
s3_bucket: SAMがテンプレートを一時的にアップロードするためのS3バケット。
capabilities: IAMリソース作成時に必要な権限。KMSキーやIAMロールを作成する際にはCAPABILITY_NAMED_IAMが必要。

3. デプロイ手順
デプロイコマンド
以下のコマンドで、template.yamlとsamconfig.tomlを使ったデプロイが可能です：

```bash
sam deploy --template-file template.yaml --config-file samconfig.toml
```

ポイント
samconfig.tomlを利用することで、デプロイに必要な設定を手動で入力する必要がありません。
すでに準備した設定ファイルに基づき、迅速かつ正確にリソースを作成できます。

デプロイ結果の確認
CloudFormationスタックに作成されたリソース（KMSキー、エイリアス）が確認できます。

まとめ
この記事では、AWS KMSキーとエイリアスをCloudFormationで作成し、SAMを使ってデプロイする手順を紹介しました。このテンプレートは、IAMポリシーやアクセス制御のベストプラクティスに基づいて設計されており、安全で柔軟なキー管理を実現します。