複雑な権限設定が不要な外部アカウントとの S3 ファイル共有
「AWS での Media Exchange」を試してみる
宮澤 晟 (監修 : 稲田 大陸)
皆さんこんにちは!プロフェッショナルサービスコンサルタントの宮澤晟です。
みなさんは、Amazon S3 を使ったことはありますか?きっと多くの方が「使ったことある!」と思われたのではないかと思います。では、Amazon S3 に限らず、オンラインストレージに保存したファイルを誰かに共有したい、と思ったことはありますか?こちらも、きっと多くの方が一度は思ったことがあるのでないでしょうか。
そんな一度でもファイルを共有したいと思ったそこのあなた!ファイルを安全に共有するために、設定などを読み込んだり、必要になるたびに自分のアカウント上で面倒な共有設定をする羽目になり、かなり大変な思いをされてきた方も多くいらっしゃるのではないかと思います。そこで今回は、Amazon S3 を使ったファイル共有を、自分のアカウント上での設定がなるべく必要ない形で実現する方法をご紹介します。
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
この記事のデモを無料でお試しいただけます »
毎月提供されるデベロッパー向けアップデート情報とともに、クレジットコードを受け取ることができます。
Amazon S3 のファイル共有方法
Amazon S3 は非公開でファイルを保存することはもちろん、不特定多数に保存したファイルを公開することもできます。しかし、非公開・公開といった単純な設定だけでなく、使用していく中で、一部の人だけにファイルを公開したいということもあると思います。その中でも、すでに AWS アカウントを持っている他の人や会社と Amazon S3 を使ってファイルを共有したいとなった場合を考えてみましょう。すぐに思いつくのは、バケットポリシーや AWS Identity and Access Management (IAM) 上で、自分の AWS アカウントの権限設定を変更し、相手の認証情報を登録して共有する方法です。
しかし、これらの方法では必ず相手の認証情報やアカウント情報を自分のアカウントに登録する必要があります。管理がうまくできるか不安という人や、そもそも会社のポリシーとして他の AWS アカウントからのアクセス権を自社の AWS アカウントに登録してはいけないという決まりになっていることも多いでしょう。そのような場合、Amazon S3 を使ったクロスアカウントのファイル共有は諦めないといけないのでしょうか。
もちろん、そんなことはありません。注目していただきたいのは、上述したような状況では、共有する相手側の AWS アカウントは何も設定する必要がないという点です。つまり、アクセスしたいと要求する側は権限の設定をお願いするだけで、設定が完了すれば自分の認証情報をそのまま使って接続することができます。これを応用すれば、2 アカウント間の S3 ファイル共有をする際、間に中継役となるアカウントと S3 バケットを用意してそこで両者の認証設定をすれば、元々の 2 アカウントではバケットポリシーの設定も IAM の設定もいらなさそうだ、ということが分かると思います。
そこで、今回は、互いのアカウントに認証情報を登録することなく Amazon S3 経由でファイル共有をできるようにする「AWS での Media Exchange 」というソリューションをご紹介します。このソリューションでは、まさに先に述べたような仕組み(中継役のアカウントと S3 バケット)を使って、元々ファイル共有をしたい 2 アカウントの認証情報を変更することなくファイル共有を実現しています。
AWS での Media Exchange とは
「AWS での Media Exchange」では、別の AWS アカウント(中継アカウント)上に S3 バケットを作成し、それを用いて異なる AWS アカウントの送信者 (Publisher) と受信者 (Subscriber) の間に安全な共有オブジェクトストレージを作成できます。送信者はファイルをこの共有 S3 バケットにコピーし、受信者が共有リソースからコンテンツを取得できるようにするアクセス許可を中継アカウント上に作成します。
実際のソリューションでは、中継アカウント上に AWS CloudFormation を用いて AWS Service Catalog 製品を展開します。中継アカウント上で必要となるバケットの作成や、送信者と受信者の間の権限設定といった作業は、全て Service Catalog 経由で行います。こうすることで、AWS の操作に慣れていない人でも、ウィザードに従って必要事項を記入するだけで中継アカウントの設定を行うことができます。また、先述したように、AWS のリソース展開や設定は中継アカウントのみで完結するため、受信・送信アカウント側での権限設定の不備による問題等を防ぐことができます。
実際のユースケースとしては、以下のようなものが想定されます。
- 共有する二者間の認証情報を直接やりとりすることなく、S3 経由のファイル共有をしたい
- AWS 上で設定項目を手動で管理することなく、予め決められたウィザードに沿って権限設定を行いたい
より具体的に、各構成部を見ていきましょう。
Media Exchange Account (上図A)
今回のソリューションの肝となる、Amazon S3 でのファイル転送を中継する部分です。以下のようなコンポーネントから構成されます。なお、箇条書きの番号は図中の番号と対応しています。
- 中継を行う S3 バケット
- AWS Key Management Service (AWS KMS) で管理される、送信者と受信者がファイルを暗号化する際に使う共通鍵
- 1 の S3 バケットにおける変更や各種操作を監視し、Amazon EventBridge 経由で Amazon Simple Notification Service (Amazon SNS) トピックに通知する通知システム
- 3 で発生した通知を、受信者や送信者のアカウントに配置した Amazon Simple Queue Service (Amazon SQS) キューに登録する Amazon SNS のサブスクリプション
- 送信要求や受信要求が各外部アカウントから送られてきた際に、それを AWS CloudFormation 経由で手軽にデプロイするための AWS Service Catalog 製品
- AWS Service Catalog を使うことで、登録要求が発生した際に AWS コンソール上で対話的に情報を登録して自動で必要なリソースの配置を行うことができるようにする意図があります。
- AWS Service Catalog を使うことで、登録要求が発生した際に AWS コンソール上で対話的に情報を登録して自動で必要なリソースの配置を行うことができるようにする意図があります。
Publisher/Subscriber Account (上図B, C)
ファイルを送受信するアカウントです。これらのアカウントは、Media Exchange Account 上の共有 S3 バケットに対する書き込み(送信者のみ)と読み取りの権限を持っています。また、共有 S3 バケットでの操作ログが流れてくる Amazon SQS キューを持っています。
使用する AWS サービス
今回のソリューションでは、以下のサービスを使用します。
使用するサービス | 目的 |
---|---|
Amazon S3 | 転送するファイルを保存し中継するために使用します。 |
AWS KMS | 転送するファイルを暗号化するために使用します。 |
Amazon EventBridge | 中継用 S3 バケットに更新があった際に、その情報をイベントとして転送するのに使用します。 |
Amazon SNS | EventBridge から転送されたイベントを後段のサービスに通知するために使用します。 |
Amazon SQS | 受信者・送信者アカウントに S3 バケットの更新情報をキューとして配信します。 |
AWS Service Catalog | 受信者・送信者を中継アカウントに登録し、必要な AWS リソースを自動配置するために使用します。 |
AWS CloudFormation | 中継アカウントのセットアップに使用します。 |
デプロイ方法 / 設定方法
それでは、実際にこのソリューションをデプロイ・実行してみましょう!
注意事項
このソリューションを完全に再現するには、3 つの AWS アカウントが必要です。しかし、複数のアカウントを持っていない場合、このソリューションを試すためにさらに 2 つの AWS アカウントを作成するのは大変だという場合も多いと思います。そこで、本記事では送信用・受信用アカウントとして個別のアカウントを用意する方法(以降、複数アカウント環境と呼びます)だけでなく、 IAM ロールを活用して中継アカウント内でシミュレートする方法(以降、単一アカウント環境と呼びます)も併せてご紹介します。
Step 1. 中継アカウント (Media Exchange Account) のセットアップ
この手順は、複数・単一アカウント環境で共通の手順です。
まず、AWS コンソールにサインインしてから、CloudFormation を開きます。リージョンはお好みのもので構いません。開いたら、左側メニューから「スタック」を選択してください。
クリックすると拡大します
次に、公式ガイドを開き、「AWS コンソールで起動する」ボタンをクリックしてください。この操作を行うと、自動で CloudFormation スタックを作成するためのウィザードが起動します。この際、デプロイしたいリージョンが正しく選択されているか、コンソール画面右上のリージョン表示を確認してください。
クリックすると拡大します
ウィザードの最初の画面では、「テンプレートの準備」欄が「テンプレートの準備完了」になっていること、及び「テンプレートの指定」の設定内容が下図の赤枠で囲われた部分の内容と一致していることを確認してください。これらが完了したら、「次へ」をクリックします。
クリックすると拡大します
次の「スタックの詳細を指定」画面では、スタックの名前を指定します。この名前は自由に決めていただいてOKですが、ここでは media-exchange-stack としています。また、パラメータでメールアドレスを指定する OwnerEmail という欄があります。こちらは、メールを受け取ることができるアドレスにしておきましょう。これらを入力したら、「次へ」をクリックします。
クリックすると拡大します
次の「スタックオプションの設定」画面では、何も変更せずそのまま「次へ」を選択してください。
最後のレビュー画面の一番最後までスクロールし、IAM リソースが作成されることへの許可にチェックを入れ、「スタックの作成」をクリックします。
クリックすると拡大します
作成が完了すると、スタック画面の「ステータス」が CREATE_COMPLETE に変化します。ステータスが CREATE_COMPLETE になったら、「出力」をクリックして、ブラウザのタブはそのままにしておいてください。
クリックすると拡大します
Step 2. シミュレーション用の IAM ロールの作成
この手順は、単一アカウント環境でのみ必要な手順です。
先にも述べたように、単一アカウント環境では送信者・受信者用にさらに2つ AWS アカウントを用意するのではなく、同一のアカウント内で IAM ロールを使ったシミュレーションを行います。ここでは、そのための IAM ロールを作成する方法について説明します。
送信者用 IAM ロール
まず、ブラウザの新しいタブで AWS コンソールを再度開き、IAM コンソールを開きます。IAM コンソールを開いたら、左側メニューから「ロール」を選択し、画面右上付近にある「ロールを作成」をクリックしてください。
クリックすると拡大します
開いたウィザードで、「信頼されたエンティティタイプ」として「AWS アカウント」を選択した上で、「このアカウント」を選択し、「次へ」をクリックしてください。
クリックすると拡大します
次の「許可を追加」画面ではなにも変更せず、そのまま「次へ」を選んでください。
最後の「名前、確認、および作成」画面で「ロール名」に mediaexchange-publisher-role と入力し、下までスクロールして「ロールを作成」をクリックしてください。
ロールの詳細画面を開いたら、「ARN」と「コンソールでロールを切り替えるためのリンク」をそれぞれコピーし、手元の PC のメモ帳アプリなどで一時保存しておいてください。一時保存ができたら、「許可ポリシー」欄の右側にある「許可を追加」から「インラインポリシーを作成」を選択し、ポリシー作成画面を開きます。
クリックすると拡大します
ポリシー作成画面が開いたら、「ビジュアルエディタ」ではなく「JSON」タブを選択して、既存の文字を入力欄から全て消した後、以下の JSON をそのまま貼り付けます。貼り付けが完了したら、画面右下の「ポリシーの確認」をクリックします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "MediaPublisherAllow",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"kms:ListAliases"
],
"Resource": "*"
}
]
}
ポリシーの確認画面で「名前」に MediaPublisherPolicy と入力し、「ポリシーの作成」をクリックして作成を完了します。
受信者用 IAM ロール
基本的な作成フローは送信者の場合と同じです。ロール作成では、最後の「名前、確認、および作成」画面で「ロール名」に mediaexchange-subscriber-role と入力する以外は送信者の場合と全く同じ操作になります。
作成後、ロールの詳細画面を開いたら、「ARN」と「コンソールでロールを切り替えるためのリンク」をそれぞれコピーし、手元の PC のメモ帳アプリなどで一時保存しておいてください。一時保存ができたら、「許可ポリシー」欄の右側にある「許可を追加」から「インラインポリシーを作成」を選択し、ポリシー作成画面を開きます。
ポリシー作成画面が開いたら、「JSON」タブを選択して、既存の文字を入力欄から全て消した後、以下の JSON をそのまま貼り付けます。貼り付けが完了したら、画面右下の「ポリシーの確認」をクリックします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "MediaSubscriberAllow",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}
ポリシーの確認画面で「名前」に MediaSubscriberPolicy と入力し、「ポリシーの作成」をクリックして作成を完了します。
Step 3. 送信者の登録
この手順は、複数・単一アカウント環境で共通の手順です。途中で設定項目が両者で異なる箇所があります。
Step 1 の最後で開いたままにしたタブに再度移ってください。キー ConsoleUrl に登録されているリンクを手元のメモ帳アプリ等に控えた後、リンクをクリックして開きます。すると、「ロールの切り替え」画面が表示されるので、何も変更せずそのまま「ロールの切り替え」ボタンをクリックしてください。
すると、受信者・送信者を登録するための AWS Service Catalog コンソールが表示されます。まずは送信者を登録するので、Publisher を選択したのち、出てきた画面の右上にある「製品を起動」ボタンをクリックしてください。
クリックすると拡大します
出てきた起動ウィザードでは、まず「プロビジョニングされた製品の名前」に Publisher-1 と入力します。次に、「製品バージョン」は v1.1.0 を選択します。
クリックすると拡大します
そのまま下にスクロールし、「パラメータ」欄の “PublisherName” に Publisher-1 と入力してください。
単一アカウント環境の場合、右図のように、“PublisherRole” 欄に Step 2 の「送信者用の IAM ロール」でコピーした送信者用の IAM ロールの ARN を貼り付けてください。
クリックすると拡大します
複数アカウント環境の場合、右図のように、“PublisherAccountId” に送信者アカウントの 12 桁の AWS アカウント ID を入力してください。
クリックすると拡大します
これらを行なったら、「製品を起動」を押して、リソースの作成を行います。
すると、プロビジョニングされた製品の詳細画面が表示されるので、「ステータス」が「使用可能」になるまで待ってください。「ステータス」が「使用可能」になったら、次の手順に移ります。
クリックすると拡大します
Step 4. 受信者の登録
この手順は、複数・単一アカウント環境で共通の手順です。途中で設定項目が両者で異なる箇所があります。
AWS Service Catalog コンソールの左側メニューから再度「製品」を選択し、今度は Subscriber を選択して「製品を起動」ボタンをクリックします。
先ほどと同様の手順で、「プロビジョニングされた製品の名前」に Subscriber-1 と入力します。次に、「製品バージョン」は「v1.1.0」を選択します。そのまま下にスクロールし、「パラメータ」欄の “SubscriberName” に Subscriber-1 と入力し、“Email” 欄には、ご自身のメールアドレスを入力してください。
単一アカウント環境の場合、右図のように、“SubscriberRole” 欄に Step 2 の「受信者用の IAM ロール」でコピーした受信者用の IAM ロールの ARN を貼り付けてください。
クリックすると拡大します
複数アカウント環境の場合、右図のように、“SubscriberAccountId” に受信者アカウントの 12 桁の AWS アカウント ID を入力してください。
クリックすると拡大します
これらを行なったら、「製品を起動」を押して、リソースの作成を行います。
すると、プロビジョニングされた製品の詳細画面が表示されるので、「ステータス」が「使用可能」になるまで待ってください。「ステータス」が「使用可能」になったら、次の手順に移ります。
Step 5. 送信者と受信者の紐付け
この手順は、複数・単一アカウント環境で共通の手順です。
AWS Service Catalog コンソールの左側メニューから再度「製品」を選択し、今度は Transfer agreement を選択して「製品を起動」ボタンをクリックします。
先ほどと同様の手順で、「プロビジョニングされた製品の名前」に Transfer_agreement-1 と入力します。次に、「製品バージョン」は v1.1.0 を選択します。そのまま下にスクロールし、「パラメータ」欄の “PublisherName” に Publisher-1 と入力し、“SubscriberName” に Subscriber-1 と入力してください。
また、他の設定項目として “ExpirationInDays” と呼ばれる項目があります。これは、中継アカウントにアップロードされたファイルを何日後に自動削除するかを制御するものです。既定では 5 (= 5 日後に削除) となっているので、必要に応じて値を調整してください。
これらを行ったら、「製品を起動」を押して、リソースの作成を行います。
クリックすると拡大します
すると、プロビジョニングされた製品の詳細画面が表示されるので、「ステータス」が「使用可能」になるまで待ってください。「ステータス」が「使用可能」になったら、画面下の「リソース」タブから「論理 ID」が ExchangeBucket となっている S3 バケットの「物理 ID」をコピーして、メモ帳アプリ等に控えておいてください。
クリックすると拡大します
Step 6. 元のアカウントの権限に戻る
この手順は、複数・単一アカウント環境で共通の手順です。
ここまでの作業が終わったら、元のアカウントの権限に一回戻ります。右上のアカウント名が表示されている部分をクリックして、「スイッチバック」をクリックします。
クリックすると拡大します
Step 7-A. 送信者としてファイルをアップロード
この手順は、単一アカウント環境にのみあてはまる手順です。複数アカウント環境の場合は Step 7-B を参照してください。
手順「送信者用の IAM ロール」で保存した URL を、ブラウザのアドレス欄に貼り付けてアクセスします。すると、「ロールの切り替え」画面が表示されるので、何も変更せずそのまま「ロールの切り替え」ボタンをクリックしてください。
次に、Amazon S3 を AWS コンソール上で開きます。バケットの中から、exchangebucket と名前がついているものを選択して、クリックしてください。exchangelogbucket と名前がついている方ではないことに注意してください。
クリックすると拡大します
バケットを開いたら、S3 コンソールから以下のように好きなファイルをアップロードしてみましょう。先ほどの IAM ロールでは Amazon S3 へアップロードする権限は付与していないのに、アップロードが正常に完了することがわかるかと思います。先述したように、これは権限がバケットポリシーで許可されているためです。
今回は同じアカウント内の異なるロールを使用していますが、これが別のアカウントであったとしても同様に動作します。
クリックすると拡大します
Step 7-B. 送信者としてログインしてファイルをアップロード
この手順は、複数アカウント環境にのみあてはまる手順です。単一アカウント環境の場合は Step 7-A を参照してください。
まず、中継アカウントからサインアウトし、送信者アカウントにログインします。ログインが完了したら、Step 6 の最後で控えた ExchangeBucket の「物理 ID」を使って、以下のような URL を組み立てます(<物理ID> を控えた物理 ID に置き換えてください)。
https://s3.console.aws.amazon.com/s3/buckets/<物理ID>
組み立てた URL をブラウザの新しいタブに入力しアクセスすると、共有バケットにアクセスすることができます。バケットを開いたら、好きなファイルをアップロードしてみましょう。
Step 8-A. 受信者としてファイルをダウンロード
この手順は、単一アカウント環境にのみあてはまる手順です。複数アカウント環境の場合は Step 8-B を参照してください。
受信者になる前に、元のアカウントの権限に一回戻ります。右上のアカウント名が表示されている部分をクリックして、「スイッチバック」をクリックします。次に、「受信者用の IAM ロール」で保存した URL を、ブラウザのアドレス欄に貼り付けて アクセスします。すると、「ロールの切り替え」画面が表示されるので、何も変更せずそのまま「ロールの切り替え」ボタンをクリックしてください。
クリックすると拡大します
切り替えが完了したら、Amazon S3 を AWS コンソール上で開きます。バケットの中から、exchangebucket と名前がついているものを選択して、クリックしてください。exchangelogbucket と名前がついている方ではないことに注意してください。
すると、先ほどアップロードしたファイルが表示されていることがわかると思います。右の画像を参考に、試しにダウンロードしてみましょう。すると、何の問題もなくダウンロードができると思います。
クリックすると拡大します
一方で、ファイルの削除やアップロードはどうでしょうか。今回は、右の画像のように、エラーがでて操作が拒否されると思います。これは、受信者には読み取り権限しか付与されていないためです。
クリックすると拡大します
Step 8-B. 受信者としてログインしてファイルをダウンロード
この手順は、複数アカウント環境にのみあてはまる手順です。単一アカウント環境の場合は Step 8-A を参照してください。
まず、送信者アカウントからサインアウトし、受信者アカウントにログインします。ログインが完了したら、Step 7-B で組み立てた URL を再度ブラウザの新しいタブに入力し、アクセスしてください。なお、URL の組み立ては Step 5 の最後で控えた ExchangeBucket の「物理 ID」を使って、以下のように行います(<物理ID> を控えた物理 ID に置き換えてください)。
https://s3.console.aws.amazon.com/s3/buckets/<物理ID>
すると、先ほどアップロードしたファイルが表示されていることがわかると思います。試しにダウンロードしてみましょう。すると、何の問題もなくダウンロードができると思います。一方で、ファイルの削除やアップロードはどうでしょうか。今回は、エラーがでて操作が拒否されると思います。これは、受信者には読み取り権限しか付与されていないためです。
Step 9. 後片付け
この手順は、複数・単一アカウント環境で共通の手順です。
- 単一アカウント環境の場合 : 元のアカウントの権限に戻ります。右上のアカウント名が表示されている部分をクリックして、「スイッチバック」をクリックします。
- 複数アカウント環境の場合 : 中継者アカウントに再度ログインし、AWS マネジメントコンソールを開いてください。
AWS Service Catalog からのリソースの削除
まず、AWS Service Catalog を用いて作成した送信者、受信者、および送信者と受信者の紐付けを削除します。
Step 3 で手元に控えた ConsoleUrl に登録されているリンクをブラウザで開き、設定を変えずに「ロールの切り替え」ボタンをクリックしてください。
AWS Service Catalog が開いたら、左側メニューから「プロビジョニングされた製品」を選択してください。
削除は作成と逆順で行います。すなわち「送信者と受信者の紐付け」→「受信者」→「送信者」の順番で削除します。
クリックすると拡大します
削除したい製品を選択し、「アクション」から「終了」を選び、これを 3 回繰り返します。ただし、削除は 1 つずつ順番に行うようにしてください。
削除が終了したら、元のアカウントの権限に戻ります。右上のアカウント名が表示されている部分をクリックして、「スイッチバック」をクリックします。
シミュレーション用の IAM ロールの削除
この手順は、単一アカウント環境にのみ必要になります。
IAM を開き、mediaexchange-publisher-role と mediaexchange-subscriber-role を IAM ロールから削除してください。
CloudFormation スタックの削除
CloudFormation コンソールを開き、「スタック」からこのソリューションで作成したスタックを選択し、「削除」を押して削除してください。もし見つからない場合は、リージョンが正しいかを確認してください。
クリックすると拡大します
S3 バケットの削除
Amazon S3 コンソールを開き、バケット名に exchangelogbucket と exchangebucket が入っているものを選択して削除してください。削除する前にバケットの中身を空にする必要がある場合は、その作業を先に行ってください。
コスト試算
中継アカウントで、10 TB のデータ転送を US East (N. Virginia) で行った場合の料金の見積もりは以下のようになります。なお、送信者・受信者アカウントについては、今回のソリューションをデプロイすることによる追加料金は発生しません。
AWS Service | Cost for 10 TB transfer |
Amazon S3 | 79.55 USD |
AWS KMS | 4.05 USD |
Amazon SNS | 0.50 USD |
Total for 10 TB transfer: | 84.10 USD |
まとめ
今回の記事では「AWS での Media Exchange」のソリューションをご紹介しました。CloudFormation と AWS Service Catalog を使った簡単な設定で、受信者と送信者側で IAM 権限などを変更することなく、安全に Amazon S3 上のファイル共有を行えることがお分かりになったと思います。このソリューションを利用して、みなさんがより安全に Amazon S3 上でファイルを共有できるお手伝いができれば幸いです。
builders.flash では、他にもさまざまな AWS ソリューションの紹介記事を投稿しています。次回の記事もぜひお楽しみに!
筆者プロフィール
宮澤 晟
アマゾン ウェブ サービス ジャパン合同会社
プロフェッショナルサービス本部 アソシエイトコンサルタント
2022 年 4 月に新卒として入社したプロフェッショナルサービスコンサルタントです。好きな AWS サービスは Amazon Aurora。趣味は映画鑑賞とドライブです。ペーパードライバーにならないよう、週末に良くドライブに出かけています。
監修者プロフィール
稲田 大陸 (Riku Inada @inariku)
アマゾン ウェブ サービス ジャパン合同会社 ソリューションアーキテクト
2021 年 4 月に AWS Japan に入社し、筋トレが趣味なソリューションアーキテクトです。好きな AWS のサービスは AWS Amplify と Amazon CDK 。最近はビートボックスを聴くのにハマっています。
AWS を無料でお試しいただけます