ハンズオン(簡易版): CFnテンプレート入門(IAM::Role)

2.1. CloudFormationテンプレートの作成 (handson-cli-cfn-iam-Role)

手順の目的

CloudFormationスタック"handson-cli-cfn-iam-Role"を作成します。

設定値の指定

手順に必要な設定値を変数に格納をします。

1. CloudFormationテンプレート名

CloudFormationテンプレート名を指定します。

変数の設定:

CLOUDFORMATION_TEMPLATE_NAME='handson-cli-cfn-iam-Role'

2. CloudFormationテンプレートの説明

CloudFormationテンプレートの説明を指定します。

変数の設定:

CLOUDFORMATION_TEMPLATE_DESCRIPTION='Template for handson-cli-cfn-iam-Role.'

3. リソースファイルディレクトリ

リソースファイルディレクトリを指定します。

変数の設定:

DIR_CLOUDFORMATION_RESOURCE="${HOME}/environment/conf-handson-cli-cfn-iam-Role/resources"

4. テンプレートファイルディレクトリ

テンプレートファイルディレクトリを指定します。

変数の設定:

DIR_CLOUDFORMATION_TEMPLATE="${HOME}/environment/conf-handson-cli-cfn-iam-Role"

ディレクトリが存在することを確認し、存在しない場合は作成します。

コマンド:

ls -d ${DIR_CLOUDFORMATION_TEMPLATE} > /dev/null 2>&1 \
  || mkdir -p ${DIR_CLOUDFORMATION_TEMPLATE}

結果(例):

(出力なし)

5. テンプレートファイル名

テンプレートファイル名の指定します。

変数の設定:

FILE_CLOUDFORMATION_TEMPLATE="${DIR_CLOUDFORMATION_TEMPLATE}/${CLOUDFORMATION_TEMPLATE_NAME}.template" \
  && echo ${FILE_CLOUDFORMATION_TEMPLATE}

結果(例):

${HOME}/environment/conf-handson-cli-cfn-iam-Role/handson-cli-cfn-iam-Role.template

設定値の確認

各変数に正しい設定値が格納されていることを確認します。

変数の確認:

cat << END

  # 1. CLOUDFORMATION_TEMPLATE_NAME:"handson-cli-cfn-iam-Role"
       CLOUDFORMATION_TEMPLATE_NAME="${CLOUDFORMATION_TEMPLATE_NAME}"
  # 2. CLOUDFORMATION_TEMPLATE_DESCRIPTION:"Template for handson-cli-cfn-iam-Role."
       CLOUDFORMATION_TEMPLATE_DESCRIPTION="${CLOUDFORMATION_TEMPLATE_DESCRIPTION}"
  # 3. DIR_CLOUDFORMATION_RESOURCE:"${HOME}/environment/conf-handson-cli-cfn-iam-Role/resources"
       DIR_CLOUDFORMATION_RESOURCE="${DIR_CLOUDFORMATION_RESOURCE}"
  # 4. DIR_CLOUDFORMATION_TEMPLATE:"${HOME}/environment/conf-handson-cli-cfn-iam-Role"
       DIR_CLOUDFORMATION_TEMPLATE="${DIR_CLOUDFORMATION_TEMPLATE}"
  # 5. FILE_CLOUDFORMATION_TEMPLATE:"${HOME}/environment/conf-handson-cli-cfn-iam-Role/handson-cli-cfn-iam-Role.template"
       FILE_CLOUDFORMATION_TEMPLATE="${FILE_CLOUDFORMATION_TEMPLATE}"

END

各変数について、上の行と下の行の値の内容もしくは形式が同じであることを確認します。 もし異なる場合は、それぞれの手順番号に戻って変数の設定を行います。

処理の実行

CloudFormationテンプレート共通部分を作成します。

変数の確認:

cat << END

  # FILE_CLOUDFORMATION_TEMPLATE:"${HOME}/environment/conf-handson-cli-cfn-iam-Role/handson-cli-cfn-iam-Role.template"
    FILE_CLOUDFORMATION_TEMPLATE="${FILE_CLOUDFORMATION_TEMPLATE}"
  # CLOUDFORMATION_TEMPLATE_DESCRIPTION:"Template for handson-cli-cfn-iam-Role."
    CLOUDFORMATION_TEMPLATE_DESCRIPTION="${CLOUDFORMATION_TEMPLATE_DESCRIPTION}"

END

コマンド:

cat << EOF > ${FILE_CLOUDFORMATION_TEMPLATE}
AWSTemplateFormatVersion: 2010-09-09
Description:
  ${CLOUDFORMATION_TEMPLATE_DESCRIPTION}

EOF

cat ${FILE_CLOUDFORMATION_TEMPLATE}

結果(例):

AWSTemplateFormatVersion: 2010-09-09
Description:
  Template for handson-cli-cfn-iam-Role.

CloudFormationテンプレートにリソース部分を追加します。

コマンド:

echo 'Resources:' >> ${FILE_CLOUDFORMATION_TEMPLATE}

for i in $( ls ${DIR_CLOUDFORMATION_RESOURCE}/*.txt ); do \
  cat $i | sed '/^$/d' >> ${FILE_CLOUDFORMATION_TEMPLATE}; \
  echo '' >> ${FILE_CLOUDFORMATION_TEMPLATE} \
; done

cat ${FILE_CLOUDFORMATION_TEMPLATE}

結果(例):

AWSTemplateFormatVersion: 2010-09-09
Description:
  Template for handson-cli-cfn-iam-Role.

Resources:
  ManagedPolicy0:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      Description: "Policy for handson-cli-cfn-iam-Role."
      Path: "/handson-cli/"
      PolicyDocument:
        Statement:
        - Action:
          - iam:ListUsers
          Effect: Allow
          Resource: '*'
          Sid: Stmt1709336354131
        Version: '2012-10-17'

  Role0:
    Type: AWS::IAM::Role
    Properties:
      Path: /handson-cli/
      Description: No-name role for handson-cli-cfn-iam-Role.
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      MaxSessionDuration: 43200
      ManagedPolicyArns:
        - !Ref ManagedPolicy0
        - arn:aws:iam::aws:policy/ReadOnlyAccess
        - arn:aws:iam::aws:policy/AWSCloudFormationFullAccess
        - arn:aws:iam::059067559142:policy/handson-cloud9/handson-cloud9-Cloud9EnvironmentOwner-policy
      Policies:
        - PolicyName: InlinePolicy
          PolicyDocument:
            Statement:
            - Action:
              - iam:ListUsers
              Effect: Allow
              Resource: '*'
              Sid: Stmt1709336354131
            Version: '2012-10-17'
      PermissionsBoundary: arn:aws:iam::aws:policy/ReadOnlyAccess
      Tags:
        - Key: handson-cli:department-name
          Value: Account Management
        - Key: handson-cli:post-name
          Value: Assistant Manager

  Role1Named:
    Type: AWS::IAM::Role
    Properties:
      Path: /handson-cli/
      RoleName: handson-cli-cfn-iam-Role-role
      Description: Named role for handson-cli-cfn-iam-Role.
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole

  Role2StackName:
    Type: AWS::IAM::Role
    Properties:
      Path: /handson-cli/
      RoleName: !Ref AWS::StackName
      Description: Role for handson-cli-cfn-iam-Role.
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole

完了確認

本手順の主処理は、以下の完了条件を満たしたときに成功したものとします。

完了条件1: CloudFormationテンプレート"handson-cli-cfn-iam-Role"が存在する。

「CloudFormationテンプレート"handson-cli-cfn-iam-Role"が存在する。」ことを確認します。

コマンド:

ls ${FILE_CLOUDFORMATION_TEMPLATE}

結果(例):

${HOME}/environment/conf-handson-cli-cfn-iam-Role/handson-cli-cfn-iam-Role.template

完了条件2: CloudFormationテンプレート"handson-cli-cfn-iam-Role"がYAMLフォーマットとして正常である。

「CloudFormationテンプレート"handson-cli-cfn-iam-Role"がYAMLフォーマットとして正常である。」ことを確認します。

コマンド:

yamllint ${FILE_CLOUDFORMATION_TEMPLATE}

結果(例):

(出力なし)

手順の完了