Help us understand the problem. What is going on with this article?

[AWS][CFn]IAMの設定2

はじめに

お久しぶりです。なじむです。年末年始とバタバタしていて更新が遅くなりました(サボっていただけ)
前回、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

作成方法

ネストスタックの作成方法を簡単に記載します。ネストスタックの作成方法は通常のスタックの作成方法と少し異なるので注意が必要ですね。

  1. S3に子スタック用のyamlファイルをアップロード
    20200118_133639.jpg

  2. 親スタック作成時のパラメータに子スタックのyamlのURLを指定
    20200118_133743.jpg

実行結果

こちらは前回と同じため、実際に作成されるリソースは省略します。ネストスタックがどのように表示されるかだけ記載します。
20200118_134813.jpg

まとめ

今回はネストスタックを使用してIAMポリシーを設定してみました。ネストスタックはうまく使えば構成が簡単に分かるようになるので、うまい使い方を考えてみるが良いと思います。
一方で、スタックを更新するときには全ての子スタックが見た目上変更される(Modifyになる)ので、その点は今後AWSに改善してほしい点です。

追伸

普段、エディターはSublime Textを使用しているのですが、Markdown Previewのプラグインを入れたら捗りました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした