メモ。AWSのポリシードキュメントをハッシュから ConverTo-Json
で生成するときは Version
キーが最初に来るように注意する必要がある。
現象
PowerShellで次のようにポリシーを設定しようとすると...
PS> $policyDoc = ( @{
>> "Version" = "2012-10-17";
>> "Statement" = @{
>> "Effect" = "Allow";
>> "Action" = "sts:AssumeRole";
>> "Resource" = $RoleArn
>> }
>> } | ConvertTo-Json )
PS> Write-IAMGroupPolicy -GroupName $GroupName -PolicyName $PolicyName -PolicyDocument $policyDoc
次のようなエラーになる。
Write-IAMGroupPolicy : The policy failed legacy parsing
原因
Version
ポリシー要素が Statement
要素より前に来ないといけない。
Version ポリシー要素は、このポリシーを処理するために使用される言語構文ルールを指定します。ポリシーの使用可能なすべての機能を使用するには、すべてのポリシーの Statement 要素の前に以下の Version 要素を含めます。
(IAM JSON ポリシーの要素:Version - AWS Identity and Access Management)
ConvertTo-Json
で生成されたポリシードキュメントでは Statement
の方が先に来ていたため、エラーになっていた。
対策
元データを通常のハッシュではなく順序付きハッシュテーブルとして作成すればよい。つまり @{...}
ではなく [ordered]{...}
で生成する。
PS> $policyDoc = ( [ordered]@{
>> "Version" = "2012-10-17";
>> "Statement" = @{
>> "Effect" = "Allow";
>> "Action" = "sts:AssumeRole";
>> "Resource" = $RoleArn
>> }
>> } | ConvertTo-Json )
PS> Write-IAMGroupPolicy -GroupName $GroupName -PolicyName $PolicyName -PolicyDocument $policyDoc