

下記のコードでCloudFormationでIAMグループを作成しました。  
${aws:username}は、下記のリンクの[IAM
ポリシーエレメントのポリシー変数に使用可能なリクエスト情報](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_variables.html#policy-
vars-formoreinfo)を使いました。

AWS AccountIdの部分もリテラルではなく変数を使う方法はないでしょうか。

下記は試してみましたがいずれもだめでした。

Resource: "arn:aws:iam::${aws:userid}:user/${aws:username}"  
ポリシー変数は、IAMユーザは、AWSアカウントではなく一意IDが返されるからかもしれませんが、確認方法がわかりませんでした。

Resource: !Sub "arn:aws:iam::${AWS::AccountId}:user/${aws:username}"  
ClodFormationの疑似パラメータを使いましたが、ポリシー変数と同じ${}表記なので、エラーになりました。

[code]

    Type: "AWS::IAM::Group"
    Properties:
      GroupName: "Users"
      Policies:
        - PolicyName: group-user-policy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "iam:GetAccountPasswordPolicy"
                Resource: "*"
              - Effect: Allow
                Action:
                  - "iam:ChangePassword"
                Resource: !Sub "arn:aws:iam::1234567890:user/${aws:username}"
    
[/code]


CC BY-SA 4.0
2018-06-02T14:13:23.320
44478
2019-01-05T06:09:45.617
2018-07-08T08:26:13.623
754
5285
question
aws aws-cloudformation aws-iam
疑似パラメータとポリシー変数の共存


CloudFormationの`Fn::Join`関数を用いると可能かと思われます。

  * [Fn::Join - AWS CloudFormation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html)

cfn-iam-group.yml

[code]

    AWSTemplateFormatVersion: "2010-09-09"
    Description: A sample template
    Parameters:
      IAMUserArn:
        Type: String
        Default: arn:aws:iam::1234567890:user/user-name
    
    Resources:
      IAMGroup:
        Type: "AWS::IAM::Group"
        Properties:
          GroupName: "Users"
          Policies:
            - PolicyName: group-user-policy
              PolicyDocument:
                Version: "2012-10-17"
                Statement:
                  - Effect: Allow
                    Action:
                      - "iam:GetAccountPasswordPolicy"
                    Resource: "*"
                  - Effect: Allow
                    Action:
                      - "iam:ChangePassword"
                    Resource: !Join
                      - ''
                      - - 'arn:aws:iam::'
                        - !Sub "${AWS::AccountId}:"
                        - 'user/${aws:username}'
    
[/code]

[code]

    aws cloudformation deploy
        --template-file ./cfn-iam-group.yml 
        --stack-name cfn-iam-group 
        --capabilities CAPABILITY_NAMED_IAM 
        --parameter-overrides IAMUserArn="arn:aws:iam::1234567890:user/user-name"
    
[/code]

  * `Fn::Join`関数で与えられた文字列配列を連結
  * 配列の要素に`Fn::Sub`関数を用いて擬似パラメータ`AWS::AccountId`を参照

IAM Groupが作成され、以下のようなポリシーがアタッチされていることが確認できました。

[![IAM Group
Policy](https://i.stack.imgur.com/aV0jG.png)](https://i.stack.imgur.com/aV0jG.png)


CC BY-SA 4.0
2019-01-05T06:09:45.617
51724
2019-01-05T06:09:45.617
31669
44478
answer