S3バケットポリシーにIP制限をした状態でMediaConvertを使用する方法
テクニカルサポートチームの丸屋 正志(Maruya Masashi)です。
1. 困っていた内容
S3 バケットポリシーに IP 制限を設定している状態で、バケット内の動画ファイルを MediaConvert で交換しようとすると以下のようなエラーが発生します。
Unable to open input file [s3://バケット名/動画.mp4]: [Failed probe/open: [Can't read input stream: [Failed to read data: Access denied to s3://バケット名/動画.mp4]]]
上記エラーが出る場合は、どの様に対応したら宜しいでしょうか?
但し、セキュリティを保つために IP 制限をした状態で、MediaConvert を実施したいと考えております。
全体のS3バケットポリシー
{ "Version": "2008-10-17", "Id": "PolicyPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::バケット名/*", "Condition": { "NotIpAddress": { "aws:SourceIp": [ "111.222.333.444/32", "555.666.777.888/16" ] } } } ] }
2. どう対応すればいいの?
MediaConvert からの GetObject(ファイル取得) ができるようにするために、Deny のステートメントにて MediaConvert が利用する IAM ロールを除外するよう 【Condition 句】にて 【aws:userid 条件キー
】 を利用致します。
また、aws:userid 条件キーでは IAM ロールの ARN で指定することができず、一意の識別子(RoleId)
を指定する必要があります。
そして、一意の識別子はマネジメントコンソール上では確認ができないため、AWS CLI もしくは API にて確認することが出来ます。
3. やってみた
3.1. IAM ロールの作成
初めに MediaConvert 用の 『IAM ロール』を新規作成します。
- 名前 : (例: MediaConvert-Role)
- アクセス権限 : (例: AmazonS3FullAccess)
- 信頼関係 : mediaconvert.amazonaws.com
IAM ロールの作成方法が不明な場合については、下記をご参照くださいませ。
3.2. RoleId を確認
次に、上記で作成した IAM ロール名(例: MediaConvert-Role)の識別子(RoleId)を確認致します。
## コマンド実行例 aws iam get-role --role-name <<ROLE NAME>> ## ロール名 : 【例 : MediaConvert-Role】の場合 aws iam get-role --role-name MediaConvert-Role
実行結果例
{ "Role": { "Path": "/", "RoleName": "<<ROLE NAME>>", "RoleId": "AROAXX123456789XX", <- こちら "Arn": "arn:aws:iam::<<ACCOUNT ID>>:role/<<ROLE NAME>>", (省略)
上記の 【"RoleId" : "AROAXX123456789XX
"】 という形式で表示されるものが、IAM ロールの 【一意の識別子
】 となります。
3.3. S3 バケットポリシーの修正
ご利用の S3 バケットポリシーの【Condition 句】にて、下記を追加していただくことで IP 制限をしていても MediaConvert などを実施することが出来るようになります。
## 記入例 "StringNotLike": { "aws:userId": "【Roleldに変更】:*" }, ## RoleId : 【例 : AROAXX123456789XX】の場合 "StringNotLike": { "aws:userId": "AROAXX123456789XX:*" },
全体の記述例については下記をご参照くださいませ。
{ "Version": "2008-10-17", "Id": "PolicyPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::バケット名/*", "Condition": { "StringNotLike": { "aws:userId": "AROAXX123456789XX:*" }, "NotIpAddress": { "aws:SourceIp": [ "111.222.333.444/32", "555.666.777.888/16" ] } } } ] }