皆様、お世話になっております。鈴木と申します。
今回はAWS CloudFormationを使用してIAMロールを作成していきたいと思います。
1.目次
2.要件
- EC2インスタンスでSSMとCloudWatchエージェントを使用するために必要な権限を付与する。
- 権限はセキュリティの観点から最小限に制限する。
3.IAMロールについて
IAMロールは、AWSリソースやサービスが特定のアクションを実行するために必要な権限を定義する「セキュリティポリシーの集約」とも言える機能です。
例えば、EC2インスタンスにSSMやCloudWatchエージェントを使用させるためには、IAMロールを作成し、適切なポリシーを付与します。このロールは、そのインスタンスが必要な操作を行う際に必要な権限だけを与えることで、セキュリティリスクを最小限に抑える役割を果たします。
IAMポリシーとの違いについて
類似サービスとしてIAMポリシーが挙げられます。
簡単に表にまとめたので参照ください。
項目 | IAMロール | ポリシー |
---|---|---|
定義 | AWSリソースやサービスがアクセス権限を持つための「役割」。 | アクセス権限を定義するための「ルール」。 |
役割 | 具体的なリソースやサービスに権限を付与する。 | どのアクションが許可されるかを詳細に指定する。 |
構成 | 一つまたは複数のポリシーを含む。 | 権限を定義するためのJSONまたはYAML形式の文書。 |
使用場所 | EC2インスタンス、Lambda関数、その他のAWSサービスで使用。 | IAMユーザー、グループ、ロールにアタッチされる。 |
管理 | AWS Management Console、CLI、またはAPIで作成・管理。 | ポリシーを作成・編集し、ロールやユーザーにアタッチ。 |
例 | AmazonEC2RoleForSSM (EC2インスタンスがSSMを使用するためのロール)。 |
AmazonS3ReadOnlyAccess (S3バケットの読み取り専用アクセスを許可するポリシー)。 |
簡単に言うと、IAMロールはEC2インスタンスなどが他のAWSリソースにアクセスするための権限を設定するためのもので、ポリシーの集合体です。一方、ポリシーはユーザーやロールに付与して、特定のアクションやリソースへのアクセスを許可しますが、リソース間の権限許可にはロールを介する必要があります。
4.構成図
- まずはロールを作成
- EC2をSSM操作できるようにIAMロールにAmazonSSMManagedInstanceCoreを付与
- CloudWatchエージェント経由でメトリクスを検出できるようにCloudWatchAgentAdminPolicyを付与
- 上記2つのポリシーを付与したロールをEC2に付与
5.全体構築ソースコード
YAMLにて記述しております。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
# EC2用IAMロールの作成
NaokiRoleEC2:
Type: 'AWS::IAM::Role'
Properties:
RoleName: 'naoki-role-ec2' # ロールの名前
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Action:
- 'sts:AssumeRole' # EC2インスタンスがこのロールを引き受けることを許可する
Principal:
Service:
- 'ec2.amazonaws.com' # このロールをEC2インスタンスが使用できるようにする
ManagedPolicyArns:
- 'arn:aws:iam::aws:policy/CloudWatchAgentAdminPolicy' # CloudWatchエージェントの管理ポリシー
- 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore' # SSM (Systems Manager) の管理ポリシー
Tags:
- Key: 'Name'
Value: 'naoki-role-ec2' # タグとしてロールの名前を設定
# オプション: このロールをEC2インスタンスに自動的にアタッチしたい場合
# InstanceProfileリソースを使用してEC2インスタンスにアタッチすることができます。
# EC2インスタンスを追加する場合は、要件に応じて設定してください。
NaokiInstanceProfile:
Type: 'AWS::IAM::InstanceProfile'
Properties:
Roles:
- Ref: 'NaokiRoleEC2' # EC2インスタンスプロファイルにロールをアタッチ
6.ソースコードの詳細
6-1.IAMロールの作成
まずはポリシーを付与する前にロールの作成をしないといけません。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::IAM::Role | IAMロールを作成するためのデフォルトの記述 |
RoleName | naoki-role-ec2 | ロールの名前 |
AssumeRolePolicyDocument Effect: Action: |
Allow sts:AssumeRole |
EC2インスタンスがこのロールを引き受けることを許可する |
Principal: Service: |
ec2.amazonaws.com | このロールをEC2インスタンスが使用できるようにする |
# EC2用IAMロールの作成
NaokiRoleEC2:
Type: 'AWS::IAM::Role'
Properties:
RoleName: 'naoki-role-ec2' # ロールの名前
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Action:
- 'sts:AssumeRole' # EC2インスタンスがこのロールを引き受けることを許可する
Principal:
Service:
- 'ec2.amazonaws.com' # このロールをEC2インスタンスが使用できるようにする
6-2.IAMポリシーを付与(SSM・CloudWatchエージェント)
上記ロールに付与するポリシーを指定
またロールへのタグの指定
使用するオプション | 設定値 | 説明 |
---|---|---|
ManagedPolicyArns | arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore arn:aws:iam::aws:policy/CloudWatchAgentAdminPolicy |
SSM (Systems Manager) の管理ポリシー CloudWatchエージェントの管理ポリシー |
Tags | Key: Name Value: naoki-role-ec2 |
タグのキーと値を設定 |
ManagedPolicyArns:
- 'arn:aws:iam::aws:policy/CloudWatchAgentAdminPolicy' # CloudWatchエージェントの管理ポリシー
- 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore' # SSM (Systems Manager) の管理ポリシー
Tags:
- Key: 'Name'
Value: 'naoki-role-ec2' # タグとしてロールの名前を設定
6-3.EC2インスタンスにIAMロールをアタッチするための設定
EC2インスタンスを作成する際にこのインスタンスプロファイルを指定することで、指定したIAMロールが自動的にインスタンスにアタッチされ、必要な権限を持つことができるようにするために下記ソースコードが必須です。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::IAM::InstanceProfile | インスタンスプロファイルを作成するためのデフォルトの記述 |
Roles | Ref: ‘NaokiRoleEC2’ | EC2インスタンスプロファイルにロールをアタッチ |
# オプション: このロールをEC2インスタンスに自動的にアタッチしたい場合
# InstanceProfileリソースを使用してEC2インスタンスにアタッチすることができます。
# EC2インスタンスを追加する場合は、要件に応じて設定してください。
NaokiInstanceProfile:
Type: 'AWS::IAM::InstanceProfile'
Properties:
Roles:
- Ref: 'NaokiRoleEC2' # EC2インスタンスプロファイルにロールをアタッチ
7.テスト
上記ではまだEC2,SSM、CloudWatchエージェントの設定は行っていないため
、下記にてテスト実施予定
【CloudFormation】AWSマルチAZ3層アーキテクチャの構築_SSM
【CloudFormation】AWSマルチAZ3層アーキテクチャの構築_CloudWatch・SNS
8.感想
IAMロールをIaCで作成する際、ロールとポリシーの関係を理解し、適切に設定することが重要です。実際に作成したものをテストで実施してリソース間での権限設定が適切に設定されているかを確認したいと思います。