[AWS][CFn]IAMの設定2

## はじめに

お久しぶりです。なじむです。年末年始とバタバタしていて更新が遅くなりました（サボっていただけ）
[前回](https://qiita.com/NaGym_t/items/8b4f4dcc489364313da3)、IAMの設定について記載しました。
今回はネストスタックを使用して、IAMの設定をしていこうという記事なります。

## 前提

前回と同じです。

- コンソールにログインした後、スイッチロールを行い任意のロールにスイッチする
- 上述のスイッチロールは特定のIPからしか実行できないよう制限する
- スイッチロールした後はIPアドレスの制限を設けず、任意の操作を実行可能とする

今回、ネストスタックを用いて記載したいのは、各グループで共通のポリシーを使用する場合があり、それを都度記載するのが面倒(管理も煩雑)になるので、ネストスタックを用いて共通部分は1回しか書かないようにしようと思います。
	
## サンプルコード

ネストスタックはその名の通り、ネストしたスタックです。親スタックがあり、その親スタックから子スタックを作成します。
今回の場合は以下のようにします。

- 親スタック：iam.yaml
- 子スタック：common.yaml、Administrator.yaml

では、サンプルコードです。

### iam.yaml

```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

```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

```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396510/184f3d1c-3356-1f82-f2ee-bbfe5aedc04e.jpeg)

1. 親スタック作成時のパラメータに子スタックのyamlのURLを指定
![20200118_133743.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396510/3a03696f-3fe3-db24-f463-54c752f77ae9.jpeg)


## 実行結果

こちらは前回と同じため、実際に作成されるリソースは省略します。ネストスタックがどのように表示されるかだけ記載します。
![20200118_134813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396510/e13e9a99-2806-fc30-12f1-fec0a7caec0c.jpeg)

## まとめ

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

###### 追伸

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