ヤマムギ

growing hard days.

*

ハンズオン: IAMロール、Secrets Manager、KMS ~AWS認定デベロッパーアソシエイト(DCA-C02)~

   

このブログは2026年6月29日翔泳社さんより発売される「AWS教科書 AWS認定デベロッパーアソシエイト テキスト&問題集」で扱う内容を体験していただくためのハンズオンガイドです。

このハンズオンガイドでは、VPC、IAMロール、Secrets Manager、KMSを組み合わせて、EC2インスタンスからシークレット情報を安全に取得し、KMSサーバー側暗号化でS3に保存するアプリケーションを構築します。
アクセスキーを作成して使用するのではなく、EC2にIAMロールで安全に認証する方法と、データの透過的なサーバー側暗号化を体験します。

全体構成

東京リージョンで構築してください。
完成する構成は以下のとおりです。

(1) VPCにパブリックサブネットとプライベートサブネットを作成する(S3ゲートウェイエンドポイント付き)
(2) セキュリティグループでEC2へのアクセスを制限する
(3) KMSカスタマーマネージドキーを作成する
(4) Secrets Managerにシークレット情報を保存する(KMSキーで暗号化)
(5) S3バケットをKMS暗号化で作成し、VPCエンドポイント経由のみ許可するバケットポリシーを設定する
(6) IAMロールを作成してEC2に割り当てる
(7) EC2上のPythonスクリプトでSecrets Managerから値を取得し、S3に暗号化保存する

一連のフロー:EC2(IAMロール) → Secrets Managerから取得 → 取得した情報をKMS暗号化でS3に保存

準備:IAMポリシーの作成とアタッチ

ハンズオンで使用するIAMユーザーまたはIAMロールに、以下のポリシーをアタッチしてください。

タスク 1:VPCとサブネットを作成する

目的

パブリックサブネットとプライベートサブネットを持つVPCを作成して、ネットワークセキュリティの基本を構築しましょう。

手順

(1) マネジメントコンソール上部の検索フィールドにVPCと入力し、VPCコンソールにアクセスします。
(2) [VPCを作成]をクリック。
(3) 以下の設定を行います:

項目 設定値
作成するリソース VPCなど
名前タグの自動生成 handson-sec
IPv4 CIDRブロック 10.0.0.0/16
アベイラビリティゾーンの数 1
パブリックサブネットの数 1
プライベートサブネットの数 1
NATゲートウェイ なし
VPCエンドポイント S3ゲートウェイ

(4) [VPCを作成]をクリック。
(5) VPCが作成されたら、リソースマップでパブリックサブネットとプライベートサブネットが作成されていることを確認します。
(6) パブリックサブネットのルートテーブルにインターネットゲートウェイ(igw-)へのルートがあることを確認します。
(7) プライベートサブネットのルートテーブルにはインターネットゲートウェイへのルートがないことを確認します。
(8) VPCコンソールの左メニューから[エンドポイント]を開き、S3ゲートウェイエンドポイント(vpce-)が作成されていることを確認します。エンドポイントIDをメモしておきます。
(9) S3ゲートウェイエンドポイントを選択し、[ルートテーブル]タブを確認します。プライベートサブネットのルートテーブルのみ関連付けられている場合は、パブリックサブネットのルートテーブルも追加します。[ルートテーブルの管理]をクリックし、パブリックサブネットのルートテーブル(handson-sec-rtb-public)にもチェックを入れて[ルートテーブルの変更]をクリック。

ポイント

  • パブリックサブネットはインターネットゲートウェイへのルートを持ち、インターネットとの通信が可能です。
  • プライベートサブネットにはインターネットへのルートがないため、外部からの直接アクセスから保護されます。
  • S3ゲートウェイエンドポイントを作成すると、VPC内のリソースからインターネットを経由せずにS3にアクセスできます。
  • ゲートウェイエンドポイントはS3とDynamoDBのみで使用可能です。ルートテーブルにリージョンのS3が使っているルートの設定をします。

タスク 2:セキュリティグループを作成する

目的

EC2インスタンス用のセキュリティグループを作成して、アクセスを制限しましょう。

手順

(1) VPCコンソールの左メニューから[セキュリティグループ]-[セキュリティグループを作成]をクリック。
(2) 以下の設定を行います:

項目 設定値
セキュリティグループ名 handson-sec-sg
説明 Security group for handson
VPC handson-sec-vpc

(3) インバウンドルールは追加しません(セッションマネージャーで接続するためSSHポートの開放は不要です)。
(4) アウトバウンドルールはデフォルト(すべてのトラフィック許可)のままにします。
(5) [セキュリティグループを作成]をクリック。

ポイント

  • セキュリティグループはENI(Elastic Network Interface)に設定するファイアウォールです。
  • インバウンドルールで許可した通信のレスポンスは自動的に許可されます(ステートフル)。
  • Systems Managerセッションマネージャーを使うことで、SSHポート(22番)を開放する必要がなくなり、セキュリティが向上します。
  • セッションマネージャーはEC2インスタンスからAWS APIへのアウトバウンド通信で動作するため、インバウンドルールなしで接続できます。

タスク 3:KMSカスタマーマネージドキーを作成する

目的

Secrets ManagerとS3で使用する暗号化キーをKMSで作成しましょう。

手順

(1) マネジメントコンソール上部の検索フィールドにKMSと入力し、KMSコンソールにアクセスします。
(2) 左メニューから[カスタマー管理型のキー]-[キーの作成]をクリック。
(3) 以下の設定を行います:

項目 設定値
キーのタイプ 対称
キーの使用法 暗号化および復号化

(4) [次へ]をクリック。
(5) エイリアスにhandson-sec-keyと入力して[次へ]をクリック。
(6) キー管理者は自分のIAMユーザー(またはIAMロール)を選択して[次へ]をクリック。
(7) キーの使用者も自分のIAMユーザー(またはIAMロール)を選択して[次へ]をクリック。
(8) [完了]をクリック。
(9) 作成されたキーのARNをメモしておきます。

ポイント

  • カスタマーマネージドキーは、キーポリシーで誰が使えるかを制御でき、CloudTrailで使用履歴を追跡できます。
  • AWSマネージドキー(aws/secretsmanagerなど)と違い、無効化や他アカウントとの共有が可能です。
  • 同じキーをSecrets ManagerとS3の両方で使用することで、1つのキーで暗号化を統一管理できます。

タスク 4:Secrets Managerにシークレット情報を保存する

目的

データベース接続情報をSecrets Managerに保存して、KMSキーで暗号化しましょう。

手順

(1) マネジメントコンソール上部の検索フィールドにSecrets Managerと入力し、Secrets Managerコンソールにアクセスします。
(2) [新しいシークレットを保存する]をクリック。
(3) 以下の設定を行います:

項目 設定値
シークレットのタイプ その他のシークレットのタイプ
キー/値ペア(1つ目) キー: db_host、値: mydb.cluster-abc123.ap-northeast-1.rds.amazonaws.com
キー/値ペア(2つ目) キー: db_user、値: admin
キー/値ペア(3つ目) キー: db_password、値: MySecretP@ss2026
暗号化キー handson-sec-key

(4) [次へ]をクリック。
(5) シークレットの名前にhandson-sec/db-credentialsと入力して[次へ]をクリック。
(6) ローテーション設定はスキップして[次へ]をクリック。
(7) [保存]をクリック。

ポイント

  • Secrets Managerに保存されたシークレットは、指定したKMSキーで暗号化されます。
  • KMSキーへのアクセス権限がなければシークレットを復号できないため、多層防御になります。
  • 本番環境ではローテーションを有効にして、パスワードを定期的に自動更新することがベストプラクティスです。

タスク 5:S3バケットをKMS暗号化で作成する

目的

シークレット情報取得ログの保存先として、KMS暗号化が有効なS3バケットを作成しましょう。

手順

(1) S3コンソールにアクセスし、[バケットを作成]をクリック。
(2) 以下の設定を行います:

項目 設定値
バケット名 handson-sec-output-{自分の名前など一意の文字列}
リージョン ap-northeast-1
デフォルトの暗号化-暗号化タイプ AWS Key Management Serviceキーによるサーバー側の暗号化(SSE-KMS)
AWS KMSキー 使用可能なKMSキーから選択-handson-sec-key
バケットキー 有効にする

(3) [バケットを作成]をクリック。
(4) 作成したバケットを開き、[アクセス許可]タブの[バケットポリシー]セクションで[編集]をクリック。
(5) 以下のポリシーを貼り付けます(バケット名とVPCエンドポイントIDは自分のものに置き換えてください):

(6) [変更の保存]をクリック。
(7) マネジメントコンソールやCloudShellからこのバケットにファイルをアップロードしようとすると、VPCエンドポイント経由ではないためアクセス拒否されることを確認します:

「upload failed … AccessDenied」のエラーが表示されます。
CloudShellはVPC内ではないため、バケットポリシーにより拒否されました。

ポイント

  • SSE-KMSを設定すると、このバケットにアップロードされるすべてのオブジェクトがKMSキーで暗号化されます。
  • バケットキーを有効にするとKMS APIの呼び出し回数が削減されてコストが最適化されます。
  • バケットポリシーのaws:sourceVpce条件により、指定したVPCエンドポイント経由でのみオブジェクト操作が許可されます。
  • CloudShellやマネジメントコンソールからのオブジェクト操作はブロックされ、VPC内のEC2からのみアクセス可能になります。

タスク 6:IAMロールを作成してEC2インスタンスに割り当てる

目的

EC2インスタンスがSecrets ManagerとS3にアクセスするためのIAMロールを作成して、安全に権限を付与しましょう。

手順

(1) IAMコンソールにアクセスし、左メニューから[ロール]-[ロールを作成]をクリック。
(2) 以下の設定を行います:

項目 設定値
信頼されたエンティティタイプ AWSのサービス
サービスまたはユースケース EC2
ユースケース EC2 Role for AWS Systems Manager

(3) [次へ]をクリック。
(4) 許可ポリシーにAmazonSSMManagedInstanceCoreが選択されているのを確認して[次へ]をクリック(あとでインラインポリシーを追加します)。
(5) ロール名にhandson-sec-ec2-roleと入力して[ロールを作成]をクリック。
(6) 作成したhandson-sec-ec2-roleを開き、[許可を追加]-[インラインポリシーを作成]をクリック。
(7) [JSON]タブで以下のポリシーを貼り付けます(KMSキーのARNとバケット名は自分のものに置き換えてください):

(8) ポリシー名をhandson-sec-ec2-policyとして保存します。
(9) 次に、EC2インスタンスを起動します。EC2コンソールにアクセスし、[インスタンスを起動]をクリック。
(10) 以下の設定を行います:

項目 設定値
名前 handson-sec-ec2
AMI Amazon Linux 2023 AMI
インスタンスタイプ t3.micro
キーペア キーペアなしで続行
ネットワーク設定-VPC handson-sec-vpc
ネットワーク設定-サブネット handson-sec-subnet-public(パブリック)
パブリックIPの自動割り当て 有効化
セキュリティグループ handson-sec-sg(既存)
高度な詳細-IAMインスタンスプロファイル handson-sec-ec2-role

(11) [インスタンスを起動]をクリック。
(12) インスタンスが実行中になったら、Systems Managerセッションマネージャーで接続します。インスタンスを選択して[接続]をクリック。
(13) [セッションマネージャー]タブを選択して[接続]をクリック。
(14) ターミナルで認証情報を確認します:

handson-sec-ec2-roleのARNが表示されることを確認します。

ポイント

  • IAMロールの信頼ポリシーにより、ec2.amazonaws.comだけがこのロールを引き受け(AssumeRole)可能です。
  • IAMロールを使うことで、アクセスキーをEC2に保存せずに安全にAWSサービスにアクセスできます。
  • Systems Managerセッションマネージャーを使うことで、SSHキーの管理やSSHポートの開放が不要になります。
  • 最小権限の原則に従い、Secrets ManagerはGetSecretValueのみ、S3はPutObjectとGetObjectのみ、KMSはDecryptとGenerateDataKeyのみを許可しています。
  • 本番環境ではプライベートサブネットにEC2を配置し、VPCエンドポイント(ssm、ssmmessages、secretsmanager)を使うことで、インターネットを経由せずにセキュアに通信できます。今回はインターフェイスエンドポイントのコストを考慮してパブリックサブネットを使用しています。

タスク 7:EC2からSecrets Managerの値を取得してS3に暗号化保存する

目的

EC2上でPythonスクリプトを実行して、Secrets Managerからシークレットを取得し、取得した情報をKMS暗号化でS3バケットに保存しましょう。

手順

(1) セッションマネージャーのターミナルで、pipとboto3をインストールします:

(2) 以下のPythonスクリプトを実行します(S3バケット名は自分のものに置き換えてください):

以下のような出力が表示されれば成功です。

(3) S3コンソールでバケットを開き、logsフォルダにファイルが保存されていることを確認します。

ポイント

  • EC2上のスクリプトはIAMロールの一時認証情報を自動的に使用しているため、アクセスキーIDを発行してコード内にアクセスキーを書いたり、.aws/credentialsファイルなどを設定する高リスクの手段をとる必要がありません。
  • Secrets Managerから取得する際、KMSのDecrypt権限が必要です(シークレットがKMSキーで暗号化されているため)。
  • S3にPutObjectする際、KMSのGenerateDataKey権限が必要です(SSE-KMSでオブジェクトを暗号化するため)。

クリーンアップ

ハンズオンで作成したリソースをすべて削除します。以下の順番で削除してください。

(1) EC2インスタンスの終了

EC2コンソールでhandson-sec-ec2インスタンスを選択し、[インスタンスの状態]-[インスタンスを終了(削除)]をクリックします。

(2) S3バケットの削除

S3コンソールでhandson-sec-output-{自分の名前}バケットを開き、[アクセス許可]タブの[バケットポリシー]で[削除]をクリックしてバケットポリシーを削除します。
この時点でアップロードされたオブジェクトのプロパティで、KMSキーによって暗号化されていることを確認できます。
その後、バケット内のオブジェクトを削除してから、バケットを削除します。

(3) Secrets Managerのシークレット削除

Secrets Managerコンソールでhandson-sec/db-credentialsを選択し、[アクション]-[シークレットを削除]をクリック。待機期間を最小の7日に設定して削除をスケジュールします。

(4) KMSキーの削除

KMSコンソールでhandson-sec-keyを選択し、[キーのアクション]-[キーの削除をスケジュール]をクリック。待機期間を7日(最小)に設定して削除をスケジュールします。

(5) IAMロールの削除

IAMコンソールでhandson-sec-ec2-roleを削除します。

(6) VPCの削除

VPCコンソールでhandson-sec-vpcを選択し、[アクション]-[VPCの削除]をクリックします。関連するサブネット、ルートテーブル、インターネットゲートウェイ、セキュリティグループも一括で削除されます。

(7) ハンズオン用ポリシーの削除

ハンズオン用に作成したIAMポリシーがあれば削除します。

まとめ

タスク サービス 役割
タスク 1 VPC パブリック/プライベートサブネットによるネットワーク分離
タスク 2 セキュリティグループ ファイアウォールによるアクセス制限
タスク 3 KMS 暗号化キーの作成と管理
タスク 4 Secrets Manager シークレット情報の安全な保存(KMS暗号化)
タスク 5 S3 KMS暗号化でのデータ保存先
タスク 6 IAMロール EC2への安全な権限付与(一時認証情報)
タスク 7 アプリケーション実行 Secrets Manager取得 → S3暗号化保存の一連の動作確認

このハンズオンで体験したセキュリティの特徴をまとめます。

  • VPCとセキュリティグループにより、ネットワークレベルでアクセスを制御できます。
  • IAMロールを使うことで、EC2にアクセスキーを保存せずに安全にAWSサービスにアクセスできます。
  • Secrets Managerにシークレット情報を保存することで、コードにパスワードをハードコードする必要がなくなります。
  • KMSカスタマーマネージドキーにより、Secrets ManagerとS3の暗号化を統一管理し、アクセス権限のないユーザーからデータを保護できます。
  • 最小権限の原則に従い、必要なアクションのみを許可することでセキュリティを強化しています。

最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「AWS認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS , , , , , ,

  関連記事

「JAWS-UG DE&I AWS re:Invent 2024 recap サーバーレス ハンズオン」でサポーターしてきました

JAWS-UG DE&I開催の「AWS re:Invent 2024 r …

IAMセッションポリシーの利用(GetFederationToken)

GetFederationTokenでのセッションポリシーは、呼び出し元のIAM …

AWSアカウントでルートユーザーが使用されたときにTeamsへ投稿する

Organizations組織内のアカウントのいずれかでルートユーザーが使用され …

AWS Transit Gateway Network ManagerにTransit Gatewayを登録してルートアナライザーで確認

グローバルネットワークの作成 VPC左ペインのメニュー Transit Gate …

AWS Lambdaで Unable to import module エラーが発生したときは

そもそも、Pycharmのナビゲーションペインでディレクトリごとドラッグ&amp …

AWS Systems Manager AutomationでEC2の自動停止

Systems Manager Automationがない時代に、Lambdaを …

2017年、このブログ(WordPress(Amazon EC2 + RDS))で対応してきたこと

Amazon Web Services Advent Calendar 2017 …

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト – プロフェッショナル」を執筆しました

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテク …

Lambdaバージョンとエイリアスとトリガー

Lambdaのバージョン、エイリアスにはそれぞれ別のトリガーが設定できます。 上 …

Route 53 の加重ラウンドロビンルーティングでロードバランサー

Route 53の加重ラウンドロビンで両方1に設定してみました。 上図はイメージ …