こんにちは!コンサル部のinomaso(@inomasosan)です。
既存のEC2から起動テンプレートを作成したところ、何故かインスタンス設定パラメーターがひとつも入力されませんでした。
作業で利用したIAMユーザのIAMポリシーにはAdministratorAccessをアタッチしていたので、詳しく調べてみることにしました。
まずは原因から
- 該当のIAMユーザにはIP制限のIAMポリシーもアタッチされていた
- 既存のEC2から起動テンプレート作成時に、CloudFormationなどと同様にAWSサービスがユーザーに代わってリクエストしていた
- CloudFormationのようなAWSサービスがユーザーに代わってリクエストするようなサービスだと、AWSサービスが利用するIPアドレスでの操作するため内部的にエラーとなっていた
- 起動テンプレートの場合、インスタンス設定パラメーターの入力がエラーとなっても、起動テンプレート自体の作成は完了していないため、CloudTrailにも履歴が残らない
対処方法
以下いずれかの方法で対処可能です。
- IP制限している
"Condition"
ブロック内に"aws:ViaAWSService"
を追加 - IAMユーザからスイッチロールするIAMロールを作成
IP制限している"Condition"
ブロック内に"aws:ViaAWSService"
を追加
IP制限を残しつつ、AWSサービスがAWSリソースへアクセスすることを許可するには、以下のようなポリシーに修正することで実現できます。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"xxx.xxx.xxx.xxx/xx",
"xxx.xxx.xxx.xxx/xx"
]
},
"Bool": {"aws:ViaAWSService": "false"}
}
}
}
また上記のポリシーだと、CloudShellを利用できません。 ちょっとした作業対応するのに非常に便利なため、下記のポリシーに修正して使用できるようにしましょう
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"xxx.xxx.xxx.xxx/xx",
"xxx.xxx.xxx.xxx/xx"
]
},
"Bool": {"aws:ViaAWSService": "false"},
"StringNotLike": {
"aws:userAgent": "*aws-cli*"
}
}
}
}
IAMユーザからスイッチロールするIAMロールを作成
IAMユーザとIAMロールで役割を分けることでも対応可能です。
イメージとしては、下記ブログのようにIAMユーザはIPアドレス制限やMFA強制等を設定、IAMロールでAWS操作に必要な権限を付与する形となります。
AWSアカウントが複数ある場合は、こちらの方法で対応するのがよいでしょう。
参考
まとめ
まさか起動テンプレートの作成時に、CloudFormationのようなAWSサービスがユーザーに代わってリクエストするような操作をしているとは思いませんでした。
IP制限をする場合は、上記も考慮したIAMポリシーを設定するように注意するのが良さそうです。
この記事が、どなたかのお役に立てば幸いです。それでは!