AWSIaC

AWSのCloudFormationでIaCを実践(2) – IAM Role

AWS

1. はじめに

AWS CloudFormationを使ってはじめてのIaC実践という事で前回の続きとなります。

目標としてはAWSアカウントを取得したゼロの状態から、IaCでVPCやRole、SecurotyGroupなどの最低限のリソースを作成して、EC2インスタンスを作成する、というところまで行う事です。

第1回はこちら 
https://syachiku.net/awscloudformationiac1-vpc/

AWSのCloudFormationでIaCを実践してみる(すべての記事一覧)
第1回 – VPC  https://syachiku.net/awscloudformationiac1-vpc/
第2回 – Role  https://syachiku.net/awscloudformationiac2-iam-role/
第3回 – SecurityGroup  https://syachiku.net/awscloudformationiac3-sg/
第4回 – EC2  https://syachiku.net/awscloudformationiac4-ec2/
第5回 – VPC FlowLogs https://syachiku.net/awscloudformationiac5-flowlogs/
第6回 – CloudTrail https://syachiku.net/awscloudformationiac6-trail/
第7回 – R53 HostedZone https://syachiku.net/awscloudformationiac7-r53-hosted/

前回は何もない状態からVPC関連のネットワークリソースを構築しました。

引き続きEC2インスタンス作成に必要となるリソースの作成を続けていきます。

※今回実施することは基本的には無料ですが、利用料金が発生する可能性が少なからずありますので、あくまで自己責任でお願いします。

2. 前提条件

  • AWSアカウントが取得できていること
  • 適切な権限(=Admin相当)をもったIAMユーザーを作成していること
  • ルーティングなどの最低限のネットワークの知識があること
  • YAMLの書きかたを知っていること(CloudFormationはjsonもしくはyamlで書けますが、今回はyamlで書いていきます。)
  • AWSのIAMやRoleについて最低限の知識があること(←追加)

3. 今回作成するAWS環境

今回はEC2インスタンスに紐づけを行うIAM RoleとProfileを作成します。

デフォルトで用意されているRoleを使っても良いのですが、セキュリティ的にはEC2から利用するサービス単位で制限を行う方が好ましいです。

そこで、とりあえずとして最低限必要なベースとなるPolicyを作成して、IAM Roleを作成して紐づけます。権限が必要になった際にあとでPolicyを追加します。

また EC2にアタッチするために必要なのでProfileについても作成します。

  • 要件
    • 将来的にUserDataでサーバ内のアプリのインストールなどを自動構築できるための権限を付与
    • ec2インスタンスをsshではなく、SystemManagerのセッションマネージャ経由で操作できるようにあらかじめ権限を付与

4. CloudFormation Template

以下のgithub上に保管していますので参照ください。

 https://github.com/gogoloon/aws-cfn-setup/tree/aws-infra-02

今回は少し短いので以下にも載せておきます。

AWSTemplateFormatVersion: "2010-09-09"
Description:
  ec2 base iam role

Resources:
  Ec2InstanceBaseRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - !Sub "ec2.${AWS::URLSuffix}"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: aws-infra-policy-ec2-base
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - "ec2:Describe*"
                  - "ec2:CreateTags"
                  - "s3:PutObject"
                  - "s3:ListBucket"
                  - "s3:GetObject"
                  - "s3:GetEncryptionConfiguration"
                  - "ssm:UpdateInstanceInformation"
                  - "ssmmessages:CreateControlChannel"
                  - "ssmmessages:CreateDataChannel"
                  - "ssmmessages:OpenControlChannel"
                  - "ssmmessages:OpenDataChannel"
                Resource: "*"

  Ec2InstanceBaseProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
        - !Ref Ec2InstanceBaseRole

## ------------------------------------------------------------#
## Output Parameters
## ------------------------------------------------------------#
Outputs:
  Ec2InstanceBaseRole:
    Value: !Ref Ec2InstanceBaseRole
    Export:
      Name: ec2-base-role

  Ec2InstanceBaseProfile:
    Value: !Ref Ec2InstanceBaseProfile
    Export:
      Name: ec2-base-profile

5. スタックの作成

それでは作成したコードを使って、リソースを作成していきます。

マネージメントコンソールにログオンして、リージョンを大阪に切り替えたのち、CloudFormationを開きます。

「スタックの作成」→「新しいリソースを使用」を選択します。

「テンプレートファイルをアップロード」からコードのファイルを選択します(今回はec2-base-role.template.yamlというファイル名で保存しています)

スタックの名称やネットワーク設定値を入力(デフォルトから変更したい場合には変更してください)してスタックの作成まで進めます。

6. 作成されたリソースの確認

しばらくするとステータスが「CREATE_COMPLETE」となりスタック作成が完了します。

それでは作成されたリソースを確認してみます。

6.1. IAM Role

7. まとめ

想定した通りのIAM Role関連のリソースが作成できました。

次回はEC2のDeploy時に必要となるSecurityGroupを作成します。

今回は以上となります。

コメント