SORACOM BeamでAmazon S3にファイルをアップロードする際の注意点
はじめに
SORACOM Beamはデバイスから送信されたリクエストをパブリッククラウドなどのサーバーに転送するためのサービスです。HTTPのほかにMQTTやLPWAなどのプロトコルにも対応していて、セキュアにデータを転送することができます。
Beam経由でS3に転送する
IAM認証を使用してデバイスから転送されたデータをBeam経由でAmazon S3にアップロードするにはSORACOMの公式ドキュメントが参考になります。
転送先バケットの作成とIAMポリシー・ロールの作成を行います。今回はbeam-test-s3-bucket
というバケット内のhoge/fuga/*
というキーにのみアップロードできるように以下のようなポリシーを作成しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Resource": "arn:aws:s3:::beam-test-s3-bucket",
"Condition": {
"StringLike": {
"s3:prefix": "hoge/fuga/*"
}
}
}
]
}
続いてBeamのセットアップに進みます。認証情報ストアには先ほど作成したIAMロールを指定します。
BeamのWebサイトエントリポイントの設定では公式ドキュメントにならい、以下のような設定を行いました。beam-test-s3-bucket
は実際に使用しているバケット名です。
項目 | 値 |
---|---|
設定名 | 任意の設定名 |
プロトコル | HTTPS |
ホスト | beam-test-s3-bucket.s3.ap-northeast-1.amazonaws.com |
他にAuthorizationヘッダの設定も必要です。
しかし、この設定でファイルをアップロードすると、以下のエラーが発生しました。
boto3.exceptions.S3UploadFailedError: Failed to upload big-file.zip to beam-test-s3-bucket/hoge/fuga/bigfile.zip: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
対処法
この問題はIAMポリシーで転送可能なキーをhoge/fuga/*
のように設定してS3パスによるアクセス制御をしようとした場合に発生します。
本来はバケット名がbeam-test-s3-bucket
、キー名がhoge/fuga/bigfile.zip
となるべきですが、Beamの設定でバケット名を指定しているため、バケット名がキー名に含まれてしまい、IAMポリシーにマッチしなくなってしまいます。つまり、バケット名がbeam-test-s3-bucket
、キー名がbeam-test-s3-bucket/hoge/fuga/bigfile.zip
でアップロードしようとしているため、IAMポリシーにマッチしなくなってしまっているのです。
この問題を回避するためにはBeamのセットアップでホスト名をバケット名を含まない形に設定します。
項目 | 値 |
---|---|
設定名 | 任意の設定名 |
プロトコル | HTTPS |
ホスト | s3.ap-northeast-1.amazonaws.com |
この設定でファイルをアップロードすると、無事にファイルがアップロードされました。
まとめ
SORACOM Beamを使用してAmazon S3にファイルをアップロードする際の注意点についてまとめました。IAMポリシーで転送可能なキーを制御する場合はBeamの設定に注意が必要です。
Discussion