概要
AWS Batchで使用するコンピューティング環境でスポットインスタンスを使用する事ができます。これによってコスト削減が狙えるのですが、配分戦略でBEST_FIT
を選ぶ際に指定するスポットフリートロール
でめちゃくちゃハマりました。
具体的にはスポットフリートロールをドキュメントの通りに作成しても、エラーとなってスポットインスタンスリクエストが失敗しました。
Linux/UNIX: The provided credentials do not have permission to create the service-linked role for EC2 Spot Instances.
こんな感じです。ドキュメントの通りにロールを作ったのですが、それだと権限が足りないようです。検索して出てくる解決策もバラバラで、ようやく解決したので記録として残しておきます。
結論
- ロール作成で選ぶユースケースは [EC2 Spot Fleet Role]です。
arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole
が付与されているはずです。 - この状態でロールを作成します。名前は [AmazonEC2SpotFleetRole]とします。
- 作成したロールに、
iam:CreateServiceLinkedRole
アクションをアタッチして下さい。
これで作成した[AmazonEC2SpotFleetRole]を、AWS Batchのコンピューティング環境で、スポットフリートロール
で指定します。
経緯
AWS Batch環境のアップデートに伴い、別環境で色々検証していた際、少しでもコストを下げるためにスポットインスタンスを利用してみようと思ったのがそもそもの始まりでした。
別環境ではすでに成功しているので、それをそのまま持っていけば良いと思ったのですが、AWS Batchコンピューティングリソースのスポットインスタンスにタグ付けがサポートされた際、推奨されていた管理ポリシーが変更され、別環境で使っていたポリシーが使えなくなっていました。
そこで新しい方法として紹介されていたロールを作成し、コンピューティング環境にアタッチしても、スポットインスタンスリクエスト自体はできるがエラーになってしまい、色々試しまくった結果、今回の結論にたどり着きました。
冒頭で「解決策がバラバラ」と書きましたが、このアップデートに関連しています。管理ポリシーの変更前と後の両方の解決策が出てくる状態なので、探すのにえらい苦労しました。
AWS Batchとスポットインスタンスは非常に相性が良く、ジョブキューにオンデマンドコンピューティング環境も入れておけばより安全にスポットインスタンスを利用する事ができるので、効率よくコストを削減できます。
もし今回と同じ事例で引っかかっている人の助けになれば幸いです。
参考
AWS Batch で INVALID コンピューティング環境を修正する方法は?
- こちらの
無効なスポットフリートロールを修正する
を参考にロールを作成
- ここに足りない権限に関する情報が記載されていました。