いつの間にかCloudFormationがIAM Roleに対応していました!
ウィスキー、シガー、パイプをこよなく愛する大栗です。
最近はほとんどCloudFormation職人と化しておりCloudFormationのテンプレートを書いているのですが、いつの間にかCloudFormationがアップデートされてIAM Roleに対応していたので確認してみます。
どうもWhat's New at AWSやRelease Notes : Amazon Web Servicesにも記載がありませんでした。。。
AWS CloudFormation Service Role
何が嬉しいの?
今までCloudFormationでStackを作成するときに、実行するIAMユーザはCloudFormationのStack作成権限の他にStackで作成するリソースに対する作成権限が必要でした。CloudFormationテンプレートで定義していないリソースも作成できる権限を与える事になるので、操作を誤ると環境を破壊してしまう可能性がありました。
IAM Roleに対応するとCloudFormationの実行ユーザはCloudFormationに対する権限さえあればテンプレートで定義しているリソースを作成できるので、既存の環境を破壊する可能性が無くなります。
CloudFormationのIAM Role対応を試してみる
前提として、【アップデート】AWS CloudFormationでYAML形式をサポートしましたで作成したCloudFormationテンプレートを使用します。
Roleでのテンプレート起動を試す
ここではバージニアリージョンで実施しています。
2016/10/1時点では、東京とカルフォルニアでIAM Roleが使用できませんでした。すぐにデプロイしてくれると思います。
2016/10/4 18:50 JST現在では全リージョンでIAM Roleが使用可能になっているようです。
CloudFormationテンプレートは、以下の内容になります。先日書いたブログエントリー【アップデート】AWS CloudFormationでYAML形式をサポートしましたで作成したテンプレートを一部修正したものです。
AWSTemplateFormatVersion: 2010-09-09 Description: Linux Stack Resources: Server01: Type: AWS::EC2::Instance CreationPolicy: ResourceSignal: Timeout: PT30M Properties: ImageId: ami-ce7508d9 InstanceType: c4.large KeyName: KeyPairName UserData: Fn::Base64: !Sub | <script> cfn-init.exe -v -c install -s ${AWS::StackId} -r Server01 -c sample --region ${AWS::Region} </script> Metadata: AWS::CloudFormation::Init: configSets: sample: - KB3134758 - vscode - finalize KB3134758: files: c:\cm\Win8.1AndW2K12R2-KB3134758-x64.msu: source: https://download.microsoft.com/download/2/C/6/2C6E1B4A-EBE5-48A6-B225-2D2058A9CEFB/Win8.1AndW2K12R2-KB3134758-x64.msu commands: wait: command: wusa.exe c:\cm\Win8.1AndW2K12R2-KB3134758-x64.msu /quiet /forcerestart cwd: C:\cm waitAfterCompletion: forever vscode: commands: a-set-execution-policy: command: powershell.exe -command Set-ExecutionPolicy RemoteSigned -Force b-find-package-provider: command: powershell.exe -command Find-PackageProvider -ForceBootstrap c-find-package: command: powershell.exe -command Find-Package -ForceBootstrap -Name VisualStudioCode -Provider chocolatey d-install-package: command: powershell.exe -command Install-Package -Name VisualStudioCode -Force finalize: commands: a-write-status: command: !Sub | cfn-signal --exit-code 0 --region "${AWS::Region}" --resource Server01 --stack "${AWS::StackName}"
権限がないIAM ユーザで実行してみる
CloudFormationは起動権限はありますが、EC2の起動権限がないユーザで実行してみます。
権限は以下の通りです。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1475252396000", "Effect": "Allow", "Action": [ "cloudformation:*", "s3:*", "iam:ListRoles", "iam:PassRole" ], "Resource": [ "*" ] } ] }
テンプレートを実行します。途中IAM Roleを選択できる項目がありますが、無視して進めます。
起動してみると途中で失敗してしまいます。
Server01
で表示されているエラーメッセージをManagement Consoleの権限不足エラーをデコードするの内容を元にデコードしてみます。
$ aws sts decode-authorization-message --encoded-message file://error.txt | jq -r '.DecodedMessage' | jq .
この様にec2:RunInstances
が失敗しています。
{ "allowed": false, "explicitDeny": false, "matchedStatements": { "items": [] }, "failures": { "items": [] }, "context": { "principal": { "id": "ABCDEFGHIJKLMNOPQRSTU", "name": "cfn-role-test", "arn": "arn:aws:iam::123456789012:user/cfn-role-test" }, "action": "ec2:RunInstances", "resource": "arn:aws:ec2:us-east-1:123456789012:instance/*", "conditions": { "items": [ { "key": "ec2:Tenancy", "values": { "items": [ { "value": "default" } ] } }, { "key": "ec2:AvailabilityZone", "values": { "items": [ { "value": "us-east-1a" } ] } }, { "key": "ec2:Region", "values": { "items": [ { "value": "us-east-1" } ] } }, { "key": "ec2:ebsOptimized", "values": { "items": [ { "value": "false" } ] } }, { "key": "ec2:InstanceType", "values": { "items": [ { "value": "c4.large" } ] } }, { "key": "ec2:RootDeviceType", "values": { "items": [ { "value": "ebs" } ] } } ] } } }
IAM Roleの権限で実行してみる
まずはCloudFormation用のRolecfn-role
を作成します。『ロールタイプの選択』の『AWS サービスロール』にAWS CloudFormation Role
が追加されているのでこちらを選択します。
ここではアタッチするポリシーをAdministratorAccess
にします。
ではCloudFormationを実行します。
IAM Roleで、先ほど作成したcfn-role
を選択します。
先程エラーになっていたEC2の起動が成功します!
さいごに
今までリソースの権限がないユーザがCloudFormationのStackを起動する時にIAM Roleを使うにはService Catalogを使う必要がありました。今回のアップデートによりService Catalogを使うような大げさな事をしなくてもIAM Roleの権限でリソースを起動できるようになりました。CloudFormationの実行ユーザには不要な権限を与える必要がなくなるので、誤操作などが発生しにくくなったのではないかと思います。