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

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

手順の目的 [why]

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

手順の完了条件と事前条件

完了条件 [after]

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

完了条件1

CloudFormationテンプレート"handson-cli-cfn-iam-Policy"が存在する。

完了条件2

CloudFormationテンプレート"handson-cli-cfn-iam-Policy"がYAMLフォーマットとして正常である。

事前条件 [before]

本手順の主処理は、以下の事前条件を満たしているときに実施します。

事前条件1

リソースファイル用ディレクトリ"${HOME}/environment/conf-handson-cli-cfn-iam-Policy/resources"が存在する。

事前条件2

テンプレートファイル用ディレクトリ"${HOME}/environment/conf-handson-cli-cfn-iam-Policy"が存在する。

事前条件3

CloudFormationテンプレート"handson-cli-cfn-iam-Policy"が存在しない。

手順の対象 [what]

  • ローカル環境

手順の標準時間

8分

設定値の指定

標準時間

2分

手順の実施に必要なモノ・情報 [resource]

手順開始には、以下が全て揃っていることが必要です。

リソース1: CloudFormationリソースファイル用ディレクトリ

  • CloudFormationリソースファイルを保存しているディレクトリの名称です。

  • 今回は"${HOME}/environment/conf-handson-cli-cfn-iam-Policy/resources"とします。

リソース2: CloudFormationテンプレート名

  • 作成するCloudFormationテンプレートの名称です。

  • 今回は"handson-cli-cfn-iam-Policy"とします。

リソース3: CloudFormationテンプレートの説明

  • 作成するCloudFormationテンプレートの説明です。

  • 今回は"Template for handson-cli-cfn-iam-Policy."とします。

リソース4: CloudFormationテンプレートファイル用ディレクトリ

  • CloudFormationテンプレートファイルを保存するディレクトリの名称です。

  • 今回は"${HOME}/environment/conf-handson-cli-cfn-iam-Policy"とします。

リソース5: CloudFormationテンプレートファイル名

  • 作成するCloudFormationテンプレートファイルのファイル名です。

  • 今回は"${HOME}/environment/conf-handson-cli-cfn-iam-Policy/handson-cli-cfn-iam-Policy.template"とします。

設定値の指定

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

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

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

変数の設定:

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

2. CloudFormationテンプレート名

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

変数の設定:

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

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

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

変数の設定:

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

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

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

変数の設定:

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

ディレクトリが存在することを確認します。

コマンド:

ls -d ${DIR_CLOUDFORMATION_TEMPLATE}

結果(例:存在する場合):

${HOME}/environment/conf-handson-cli-cfn-iam-Policy

存在しない場合は作成します。

コマンド:

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-Policy/handson-cli-cfn-iam-Policy.template

設定値の保存

設定値の保存先となるファイル名を指定します。

変数の設定:

DIR_PARAMETER="${HOME}/tmp/parameter-handson-cli-cfn-iam-Policy"
FILE_PARAMETER="${DIR_PARAMETER}/$(date +%Y-%m-%d)-cloudformation-template-create.var" \
  && echo ${FILE_PARAMETER}

結果(例):

${HOME}/tmp/parameter-handson-cli-cfn-iam-Policy/2021-08-06-cloudformation-template-create.var

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

変数の確認:

cat << EOF > ${FILE_PARAMETER}

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

EOF

cat ${FILE_PARAMETER}

下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。

処理の実行

標準時間

6分

1. 前処理

処理対象の状態確認

本手順の主処理は、以下の事前条件を満たしているときに実施します。

事前条件を満たしていないことが判明した場合、直ちに手順を中止します。

事前条件1: リソースファイル用ディレクトリ"${HOME}/environment/conf-handson-cli-cfn-iam-Policy/resources"が存在する。

「リソースファイル用ディレクトリ"${HOME}/environment/conf-handson-cli-cfn-iam-Policy/resources"が存在する。」ことを確認します。

コマンド:

ls -d ${DIR_CLOUDFORMATION_RESOURCE}

結果(例):

${HOME}/environment/conf-handson-cli-cfn-iam-Policy/resources

事前条件2: テンプレートファイル用ディレクトリ"${HOME}/environment/conf-handson-cli-cfn-iam-Policy"が存在する。

「テンプレートファイル用ディレクトリ"${HOME}/environment/conf-handson-cli-cfn-iam-Policy"が存在する。」ことを確認します。

コマンド:

ls -d ${DIR_CLOUDFORMATION_TEMPLATE}

結果(例):

${HOME}/environment/conf-handson-cli-cfn-iam-Policy

事前条件3: CloudFormationテンプレート"handson-cli-cfn-iam-Policy"が存在しない。

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

コマンド:

! ls ${FILE_CLOUDFORMATION_TEMPLATE}

結果(例):

ls: ${HOME}/environment/conf-handson-cli-cfn-iam-Policy/handson-cli-cfn-iam-Policy.template No such file or directory

2. 主処理

2.1. CloudFormationテンプレート共通部分の作成

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

変数の確認:

cat << END

  # FILE_CLOUDFORMATION_TEMPLATE:"${HOME}/environment/conf-handson-cli-cfn-iam-Policy/handson-cli-cfn-iam-Policy.template"
    FILE_CLOUDFORMATION_TEMPLATE="${FILE_CLOUDFORMATION_TEMPLATE}"
  # CLOUDFORMATION_TEMPLATE_DESCRIPTION:"Template for handson-cli-cfn-iam-Policy."
    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-Policy.

2.2. Resourcesの追加

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-Policy.

Resources:
  Group0:
    Type: AWS::IAM::Group
    Properties:
      Path: /handson-cli/

  Policy0:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: InlinePolicy
      PolicyDocument:
        Statement:
        - Action:
          - iam:ListUsers
          Effect: Allow
          Resource: '*'
          Sid: Stmt1627957715640
        Version: '2012-10-17'
      Users:
        - !Ref User0
      Groups:
        - !Ref Group0
      Roles:
        - !Ref Role0

  Role0:
    Type: AWS::IAM::Role
    Properties:
      Path: /handson-cli/
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole

  User0:
    Type: AWS::IAM::User
    Properties:
      Path: /handson-cli/

3. 後処理

完了条件の確認

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

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

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

コマンド:

ls ${FILE_CLOUDFORMATION_TEMPLATE}

結果(例):

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

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

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

コマンド:

yamllint ${FILE_CLOUDFORMATION_TEMPLATE}

結果(例):

(出力なし)

手順の完了