0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

配布されているCloudFormationテンプレートをいい感じに書き換える小ネタ

Last updated at Posted at 2021-07-30

こんにちは。AWS歴3年生の人です。

CloudFormation、便利ですよね。AWSから公式配布されているテンプレートや各ソフトウェアメーカーから公式配布されているテンプレートを使ってサクっと環境を再現することも簡単です。

ただ、会社などの業務利用しているAWSアカウントなどは「ガードレール」といった品質・セキュリティ統制が整備されていることもあり、そう簡単にサクッといかないのでその場合に、書き方を変えるだけで回避できるポイント、あるあるのチェックポイントの一例をご紹介します。

YAMLからJSONに、JSONからYAMLに変換する

「自分はYAML派なんだけど配布されているテンプレートがJSONで書かれている・・・」など

CloudFormationを流す前からやる気がそがれてしまいそうですが、以下の方法で簡単に変換ができます。

1.CloudFormation > デザイナー を起動する

2.タブ「テンプレート」を選択(下記図の①)

3.変換前のコードをペーストする(下記図の②)

4.右上の「テンプレート言語の選択」を変換後を選択する(下記図の③)

cfndesign1.png

無事に変換ができました!

cfndesign2.png

ロールのインラインポリシーをカスタマー管理ポリシーに書き換える

インラインポリシーは、ロール作成と同時に記述できて便利なのですが、後からポリシー単体で管理したい場合などがあるので、カスタマー管理ポリシーに書き換えます。

  • 変更前 インラインポリシーの例

      AdminGroupRole:
        Type: 'AWS::IAM::Role'
        Properties:
          RoleName: !Join 
            - ''
            - - !Ref pUserPoolId
              - '-AdminGroupRole'
          AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
              - Sid: ''
                Effect: Allow
                Principal:
                  Federated: cognito-identity.amazonaws.com
                Action: 'sts:AssumeRoleWithWebIdentity'
                Condition:
                  StringEquals:
                    'cognito-identity.amazonaws.com:aud': !Ref pIdentityPoolId
                  'ForAnyValue:StringLike':
                    'cognito-identity.amazonaws.com:amr': authenticated
          Policies:
            - PolicyName: vodaws-admin-group-policy
              PolicyDocument:
                Version: 2012-10-17
                Statement:
                  - Sid: VisualEditor0
                    Effect: Allow
                    Action:
                      - 's3:PutObject'
                      - 's3:DeleteObject'
                    Resource: !Sub 'arn:aws:s3:::${pInputBucket}/public/*'
    
  • 書き換えポイント

    • Policies以下を削除し、ロールとは別にカスタマー管理ポリシーとして作成するように書き換えます

    • ロールからは作成したポリシーを参照するように記述します

  • 変更後 ロールとカスタマー管理ポリシーを分けた後の例

      AdminGroupPolicy:
        Type: AWS::IAM::ManagedPolicy
        Properties:
          ManagedPolicyName: vodaws-admin-group-policy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Sid: VisualEditor0
                Effect: Allow
                Action:
                  - 's3:PutObject'
                  - 's3:DeleteObject'
                Resource: !Sub 'arn:aws:s3:::${pInputBucket}/public/*'
      AdminGroupRole:
        Type: 'AWS::IAM::Role'
        Properties:
          RoleName: !Join 
            - ''
            - - !Ref pUserPoolId
              - '-AdminGroupRole'
          AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
              - Sid: ''
                Effect: Allow
                Principal:
                  Federated: cognito-identity.amazonaws.com
                Action: 'sts:AssumeRoleWithWebIdentity'
                Condition:
                  StringEquals:
                    'cognito-identity.amazonaws.com:aud': !Ref pIdentityPoolId
                  'ForAnyValue:StringLike':
                    'cognito-identity.amazonaws.com:amr': authenticated
          ManagedPolicyArns:
            - !Ref AdminGroupPolicy      
    

    ロールとポリシーを分けることで、ひとつのリソースの記述行が短くなり、あとからポリシーを別のロールにアタッチすることもできるようになりました。

ロールにPermissions Boundaryをつけたい場合

配布されているCloudFormationはPermissions Bounbaryがないことが多いので、必要に応じて以下のようにロールに追加します。

  • 前述のロールにPermissions Boundary(ポリシー名PermissionBoundary)をつけた例

      AdminGroupRole:
        Type: 'AWS::IAM::Role'
        Properties:
          RoleName: !Join 
            - ''
            - - !Ref pUserPoolId
              - '-AdminGroupRole'
          AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
              - Sid: ''
                Effect: Allow
                Principal:
                  Federated: cognito-identity.amazonaws.com
                Action: 'sts:AssumeRoleWithWebIdentity'
                Condition:
                  StringEquals:
                    'cognito-identity.amazonaws.com:aud': !Ref pIdentityPoolId
                  'ForAnyValue:StringLike':
                    'cognito-identity.amazonaws.com:amr': authenticated
          ManagedPolicyArns:
            - !Ref AdminGroupPolicy 
          PermissionsBoundary: !Join
            - ""
            - - "arn:aws:iam::"
              - !Ref "AWS::AccountId"
              - ":policy/PermissionBoundary"  
    

その他

  • 命名ルールが定められている場合は従いましょう。

  • cognitoのidentityPoolIdのCloudFormationで、「identityPoolIdの作成が先か、アタッチするロールの作成が先か」のニワトリタマゴ問題にぶつかります。
    AWSから配布されているCloudFormationではカスタムリソースを使って動的にロールのマッピングを行って解決しています。カスタムリソースが使えない場合は、最初にどちらかの設定を空で作成し、あとから手作業でAuthRole,UnauthRoleにロールアタッチ、もしくはAssumeRolePolicy(信頼関係)を修正しています。(他に正解があるかもしれません・・・)

最後に

配布されているCloudFormationを作ってくれている方には、ただただ感謝の一言です。書き方の勉強にもなるのでいつも参考にさせてもらっています。ありがとうございます!

この記事で参考にしたCloudFormation

Creating a secure video-on-demand (VOD) platform using AWS
https://aws.amazon.com/blogs/media/creating-a-secure-video-on-demand-vod-platform-using-aws/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?