はじめに
お久しぶりです。なじむです。年末年始とバタバタしていて更新が遅くなりました(サボっていただけ)
前回、IAMの設定について記載しました。
今回はネストスタックを使用して、IAMの設定をしていこうという記事なります。
前提
前回と同じです。
- コンソールにログインした後、スイッチロールを行い任意のロールにスイッチする
- 上述のスイッチロールは特定のIPからしか実行できないよう制限する
- スイッチロールした後はIPアドレスの制限を設けず、任意の操作を実行可能とする
今回、ネストスタックを用いて記載したいのは、各グループで共通のポリシーを使用する場合があり、それを都度記載するのが面倒(管理も煩雑)になるので、ネストスタックを用いて共通部分は1回しか書かないようにしようと思います。
サンプルコード
ネストスタックはその名の通り、ネストしたスタックです。親スタックがあり、その親スタックから子スタックを作成します。
今回の場合は以下のようにします。
- 親スタック:iam.yaml
- 子スタック:common.yaml、Administrator.yaml
では、サンプルコードです。
iam.yaml
---
AWSTemplateFormatVersion: 2010-09-09
Description: IAM - Parents
# ------------------------------
# Parameters: Set your argv.
# ------------------------------
Parameters:
IAMCommonTemplateURL:
Type: String
Description: Template URL of IAM Common.
IAMAdministratorTemplateURL:
Type: String
Description: Template URL of IAM Administrator.
# ------------------------------
# Resources: Your resource list
# ------------------------------
Resources:
# IAM Resource
## Common
IAMCommon:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: !Ref IAMCommonTemplateURL
## Administrator
IAMAdministrator:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: !Ref IAMAdministratorTemplateURL
Parameters:
OnlyMyIPAccess: !GetAtt IAMCommon.Outputs.OnlyMyIPAccess
「!GetAtt IAMCommon.Outputs.OnlyMyIPAccess」の記載、「!GetAtt IAMCommon.Resources.OnlyMyIPAccess」じゃダメなのかと思い試してみたら以下のエラーが出力されて怒られました。ちゃんとOutputsしないとダメみたいですね。
Template error: resource IAMCommon does not support attribute type Resources.OnlyMyIPAccess in Fn::GetAtt
common.yaml
---
AWSTemplateFormatVersion: 2010-09-09
Description: IAM - Policy for common
# ------------------------------
# Resources: Your resource list
# ------------------------------
Resources:
# IAM(Policy) Resource
## Group's Policy -- MyIPAccess
OnlyMyIPAccess:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Deny
Action: "*"
Resource: "*"
Condition:
NotIpAddress:
aws:SourceIp:
- xxx.xxx.xxx.xxx/xx # ここは任意のIPアドレスに修正してください。
# ------------------------------
# Output: Use values by Other stack
# ------------------------------
Outputs:
OnlyMyIPAccess:
Value: !Ref OnlyMyIPAccess
Administrator.yaml
---
AWSTemplateFormatVersion: 2010-09-09
Description: IAM - Group, Role, Policy for Administrator
# ------------------------------
# Parameters: Set your argv.
# ------------------------------
Parameters:
OnlyMyIPAccess:
Type: String
Description: IAM Policy ARN of OnlyMyIPAccess.
# ------------------------------
# Resources: Your resource list
# ------------------------------
Resources:
# IAM(Group) Resource
## Administrator
GroupAdministrator:
Type: AWS::IAM::Group
Properties:
GroupName: Administrator
ManagedPolicyArns:
- !Ref AssumeAdministrator
- !Ref OnlyMyIPAccess
# IAM(Role) Resource
## Administrator
RoleAdministrator:
Type: AWS::IAM::Role
Properties:
RoleName: Administrator
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sts:AssumeRole
Principal:
AWS: !Sub ${AWS::AccountId}
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AdministratorAccess
Path: "/"
# IAM(Policy) Resource
## Group's Policy -- Administrator
AssumeAdministrator:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sts:AssumeRole
Resource: !GetAtt RoleAdministrator.Arn
作成方法
ネストスタックの作成方法を簡単に記載します。ネストスタックの作成方法は通常のスタックの作成方法と少し異なるので注意が必要ですね。
実行結果
こちらは前回と同じため、実際に作成されるリソースは省略します。ネストスタックがどのように表示されるかだけ記載します。
まとめ
今回はネストスタックを使用してIAMポリシーを設定してみました。ネストスタックはうまく使えば構成が簡単に分かるようになるので、うまい使い方を考えてみるが良いと思います。
一方で、スタックを更新するときには全ての子スタックが見た目上変更される(Modifyになる)ので、その点は今後AWSに改善してほしい点です。
追伸
普段、エディターはSublime Textを使用しているのですが、Markdown Previewのプラグインを入れたら捗りました。