[CloudFormation] CFnで環境作り完全版 Part1. IAM User編
目次
Introduction
私は仕事でAWSによく触れるのですが、AWSのリソースはCloudFormationやterraformのIacで作成することがほとんどです。
新しいプロジェクトがあるたびにインフラリソースを作成するためにCloudFormationのテンプレートファイルを毎回書いているのですが、自分用のテンプレートが欲しいと思いまして、今回自分のメモ用にCloudFormation用のテンプレートファイルと軽い説明を記事にしようかなと思い執筆しました。テンプレートの中の値については詳しく触れません。ひとつひとつ説明していると終わらないので…
またPart1のこの記事ではCloudFormationを操作するための準備としてcfn-lintの導入とIAM Userを作成します。
今回作成するもの
- CloudFormationを構文チェックするためのcfn-lint
- AWSコンソールを操作するためのIAM User
完成系
環境
$ pre-commit --version
pre-commit 3.2.2
cfn-lint: v0.76.1
前提
- AWSに登録しており、AWSコンソールにrootユーザーでログインできる(2段階認証の設定を推奨します)
handsOn
cfn-lintの設定
まず、初めにcfn-lintで使用するためのpre-commitをinstallします。
$ brew install pre-commit
$ pre-commit --version
pre-commit 3.2.2
次にCloudFormationの文法エラーを検知できるcfn-lint(https://github.com/aws-cloudformation/cfn-lint)を導入します。
gitのコミット時に自動で文法チェックできるように
https://github.com/aws-cloudformation/cfn-lint#pre-commit
を参考にします
.pre-commit-config.yaml(new)
repos:
- repo: https://github.com/aws-cloudformation/cfn-lint
  rev: v0.76.1
  hooks:
    - id: cfn-lint
      files: cloudformation/.*\.(yaml)$
設定ファイルを作成したら、pre-commitのサブコマンドでフックを登録できます。
$ pre-commit install
これでgit commitした時に自動で構文チェックが入ります。
IAM Userの作成
では本題のCloudFormationを記載していきましょう!
AWSコンソールを操作するためのUserを作成します。権限は作成できないリソースがあると困るのでroleにアタッチするPolicyを最高権限のものにします。権限はあればあるほど漏洩した時のリスクが高くなるので気をつけてください。
.pre-commit-config.yaml
cloudformation
 L iam-user.yaml(new)
AWSTemplateFormatVersion: "2010-09-09"
Description: "stackName: iam-user. IAM::User IAM::Group IAM::Role"
Resources:
  AdminIAMUser:
    Type: AWS::IAM::User
    Properties:
      UserName: admin
      Groups:
        - !Ref AdminIAMGroup
  AdminIAMGroup:
    Type: AWS::IAM::Group
    Properties:
      GroupName: admin-group
      Policies:
        - PolicyName: PolicieAllowAssumeRoleAdmin
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - sts:AssumeRole
                Resource:
                  - !GetAtt AdministratorRole.Arn
                Condition:
                  Bool:
                    aws:MultiFactorAuthPresent: true
  AdministratorRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: system-administrator
      Description: aws resource administrator role
      MaxSessionDuration: 43200 # 12h
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AdministratorAccess
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            AWS: !Sub arn:aws:iam::${AWS::AccountId}:root # 循環依存エラーにならないようにAWSアカウント全体を指定
          Action: sts:AssumeRole
          Condition:
            Bool:
              aws:MultiFactorAuthPresent: true
このテンプレートを流していきます。CloudFormationへの反映はaws-cliでもできるのですが、今回はAWSコンソールで流していきます。

②のファイルの選択で上記で作成したyamlファイルを選択します。
そのまま画面に沿っていくとスタックが作成されます。
作成したリソースの内容としては、
- AdminIAMUser: ログインして操作するためのユーザー
- AdminIAMGroup: ユーザーの権限管理をするためのユーザーグループ
- AdministratorRole: 対象のユーザーグループのみ切り替えることのできるRole- 2段階認証を設定しているユーザーのみRole切り替え可能
- 権限は最高権限
- 切り替え時の有効期限は12h
 
IAM Userとしてログインするための設定
上記でユーザーを作成しましたが、まだ作成したユーザーにログインすることはできません。
そのため、ログインするために必要な設定とセキュリティを高めるために2段階認証を設定していきたいと思います。2段階認証を設定しているユーザーでないと権限があるRoleに切り替えることができません。
ここで行う認証設定はCloudFormationでも実施できるのですが、結構めんどくさいので手動で行います。
以下の画像に沿ってクリックしていきます。


これでIAM UserでAWSコンソールにログインできます。
次に2段階認証を設定していきます。

「MFA デバイスの割り当て」をクリックしてMFAを設定します。
これでIAM Userでログインするための設定は完了しました。
IAM Userでログインする
では実際にログインしてみましょう。

上記の画面の後に出てくるMFA認証を入力したらAWSコンソールにログインできると思います。
ただ、ログインしただけではUserの権限が弱くほとんどの操作ができないので、強い権限のRoleに切り替えます


画像のようにアカウントIDとCloudFormaitonで作成したロール名を入力し、対象のロールに切り替えます
AWSコンソールで右上に切り替えたロール名が表示されていればOKです。
終わりに
CloudFormationで環境構築する準備がこれで整いました!CloudFormationのサンプルは公式でありますが、ちょっと用途が限られており私的には使いにくいので、自分なりのテンプレートを次の記事で記載していきます。
AWSのリソースを作成する時は、構築の再現性とセキュリティも気にしていきましょー
