個人的備忘録：Secrets Manager を活用した AWS のセキュアなインフラ構築と CLI を使った作成方法

## はじめに

AWS Secrets Manager は、データベースの認証情報や API キーを安全に管理し、自動的にローテーションできるサービスです。  

:::note info
**本記事では、Secrets Manager の基本機能や実際の使い方をまとめました。**
::: 

シークレット情報をコード内に直接書かずに管理できるため、**セキュリティ向上** につながります。  

AWS を活用した **安全な認証情報管理** に興味がある方の参考になれば幸いです。

## 書こうと思ったきっかけ

AWS を利用する際、**認証情報の管理は非常に重要な課題** の一つです。  

環境変数や設定ファイルで管理すると、**漏えいや管理の手間が増えてしまいます**。  

:::note warn
***Secrets Manager を活用すれば、**安全かつ簡単にシークレット情報を管理できる** ことを知り、そのメリットを整理しようと思いました。***
:::

また、**実際に使ってみることで、具体的な導入手順をまとめる価値がある** と感じました。

## AWS Secrets Managerについて

AWS Secrets Manager は、データベースの認証情報、API キー、その他のシークレット情報を安全に管理し、自動的にローテーションできるAWSのマネージドサービスです。

![Screenshot 2025-02-07 at 11.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6702b6d2-13ef-a73d-06f3-f2d483bffcb8.png)
引用画像：https://aws.amazon.com/jp/secrets-manager/

アプリケーションがコード内で直接シークレットを扱わないようにすることで、セキュリティを向上させることができます。

## 主な機能

**1. シークレットの安全な保存**  
- **暗号化**: AWS Key Management Service (KMS) を利用して保存されるシークレットは自動的に暗号化。  
- **IAM ポリシーによるアクセス制御**: ユーザーやアプリケーションごとにアクセス権限を設定可能。  

**2. シークレットの自動ローテーション**  
- **RDS や Redshift などの AWS サービスと統合し、データベースの認証情報を自動更新。**  
- **Lambda を利用したカスタムローテーションも可能。**  

**3. シークレットの取得**  
- **AWS SDK, CLI, API, CloudFormation などを通じてプログラム的に取得可能。**  
- **キャッシュを推奨**: Secrets Manager への頻繁なアクセスはコストがかかるため、アプリ側でキャッシュを利用するのが一般的。  

**4. 監査とモニタリング**  
- **AWS CloudTrail と統合し、誰がどのシークレットにアクセスしたかを記録可能。**  

## ユースケース

**データベースの認証情報管理**  
- **RDS や Aurora などのデータベース認証情報を管理し、自動ローテーションを実施。**  

**API キーやトークンの管理**  
- **外部 API のアクセスキーや OAuth トークンを安全に保管し、アプリケーションから安全に取得。**  

**認証情報を含む CI/CD のセキュリティ強化**  
- **GitHub Actions, CodePipeline などの CI/CD 環境で Secrets Manager を活用してシークレットを安全に取得。**  


## 実際に使ってみた

AWS Secrets Manager を使用してシークレットを作成・取得・更新・削除する基本的なコマンドを紹介します。

**作成後の画面**

![Screenshot 2025-02-07 at 12.11.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1739a554-1c8a-4db1-5ed3-e356239d4ca6.png)

**簡単にハンズオンできる形式となっているので、ぜひ参考にしてみてください。**

### 1. シークレットの作成
指定した名前でシークレットを作成し、ユーザー名とパスワードを保存します。

```sh
aws secretsmanager create-secret \
    --name MyDatabaseSecret \
    --secret-string '{"username":"admin","password":"mypassword"}'
```

**オプション説明**

- **`--name`**：シークレットの名前（例: `MyDatabaseSecret`）。  
- **`--secret-string`**：保存するシークレットデータ（JSON 形式）。  

### 2. シークレットの取得
作成したシークレットの値を取得します。

```sh
aws secretsmanager get-secret-value \
    --secret-id MyDatabaseSecret
```

**オプション説明**

- **`--secret-id`**：取得するシークレットの名前または ARN。  

**出力例**

```sh
{
    "ARN": "arn:aws:secretsmanager:us-east-1:123456789012:secret:MyDatabaseSecret-abc123",
    "Name": "MyDatabaseSecret",
    "SecretString": "{\"username\":\"admin\",\"password\":\"mypassword\"}"
}
```

### 3. シークレットの更新
既存のシークレットを新しい値に更新します。

```sh
aws secretsmanager update-secret \
    --secret-id MyDatabaseSecret \
    --secret-string '{"username":"admin","password":"newpassword"}'
```

**オプション説明**

- **`--secret-id`**：更新するシークレットの名前。  
- **`--secret-string`**：新しいシークレットデータ。  

### 4. シークレットの削除
指定したシークレットを削除します。

```sh
aws secretsmanager delete-secret \
    --secret-id MyDatabaseSecret
```

**オプション説明**

- **`--secret-id`**：削除するシークレットの名前。

## ベストプラクティス

**IAM ポリシーを適切に設定**  
- **アプリケーションごとに最小限の権限を付与**（最小権限の原則）。  
- **`secretsmanager:GetSecretValue` のアクセス権限を適切に制御。**  

**シークレットのローテーションを自動化**  
- **AWS Lambda を使って、独自のローテーションロジックを実装可能。**  

**CloudTrail で監査ログを有効化**  
- **どのユーザーがシークレットにアクセスしたかを監視し、不正アクセスを検知。**  

## まとめ

AWS Secrets Manager は、**データベース認証情報や API キーを安全に保存・管理できるサービス** であり、**自動ローテーションや監査機能** を備えています。

:::note info
**IAM ポリシーの適切な設定** や **キャッシュの活用** などのベストプラクティスを実践することで、**コストを抑えつつ安全な運用** が可能です。
:::

今回の内容が、どなたかの技術の支えになれば幸いです。