AWS CloudFormation で not authorized to perform with an explicat deny
Table of Contents
ここ3ヶ月程度でついにAWSを触る機会が出てきたが、詰まったことがあるのでメモ 📝
エラー
CloudFormationを利用したリソース作成を行おうとしたところ、一部リソースの作成においてエラーを検出。
Resource handler returned message: "User: arn:aws:iam::hoge is not authorized to perform: logs:CreateLogDelivery with an explicit deny in an identity-based policy"
ただ、とりあえず初期段階での環境構築だったので、作業しているIAMへはAdministratorAccess
が付与されているはず。。。
原因
社内のセキュリティーポリシーにより、AWSへアクセス可能な接続元IPアドレスを制限していたが、CloudFormationでは、作業している端末のIPアドレスではない、CloudFormationサービスのIPアドレスがAWSアカウントにアクセスする場合があり、アクセスできなかったことが原因でした。
aws:SourceIp
AWS 全体の条件を使用しないでください。CloudFormation はリクエストの送信元 IP アドレスではなく、独自の IP アドレスを使用してリソースをプロビジョニングします。例えば、スタックを作成する際に、CloudFormation は、Amazon EC2 インスタンスを起動したり Amazon S3 バケットを作成したりするために、CreateStack
コールや create-stack コマンドを実行した IP アドレスではなく、その IP アドレスからリクエストを行います。
引用: AWS Identity and Access Management で CloudFormation アクセスを制御する
まさに上記のaws:SourceIp
で接続元IPを絞っており、絞っていることは認識していたのですが、自身のIAMのperformが拒否されているというエラーからだと分かりづらかった・・・
対応
今回のように、AWSサービスがAWSへリクエストを実行したかを確認するため、aws:ViaAWSService
を条件に追加。
具体的には接続元を制限していたIAMポリシーを以下のようにすることで回避できました。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"接続許可IPリスト",
]
},
"Bool": {
"aws:ViaAWSService": "false"
}
}
}
}