Skip to content

When using multiple S3 buckets, result callback is not called on successful uploads to the non-default S3 buckets #3150

@minlite

Description

@minlite

Before opening, please confirm:

Language and Async Model

Kotlin

Amplify Categories

Storage

Gradle script dependencies

implementation(libs.bundles.amplify.liveness)

...

[bundles]
amplify-liveness = [
    "amplify-liveness",
    "amplify-aws-auth-cognito",
    "amplify-aws-storage-s3",
]
...
amplify-liveness = { group = "com.amplifyframework.ui", name = "liveness", version.ref = "amplifyLiveness" }
amplify-aws-auth-cognito = { group = "com.amplifyframework", name = "aws-auth-cognito", version.ref = "amplifyAuthCognito" }
amplify-aws-storage-s3 = { group = "com.amplifyframework", name = "aws-storage-s3", version.ref = "amplifyStorageS3" }
...
amplifyLiveness = "1.8.0"
amplifyAuthCognito = "2.30.2"
amplifyStorageS3 = "2.30.2"

Environment information

# Put output below this line


Please include any relevant guides or documentation you're referencing

No response

Describe the bug

I have two imported S3 buckets configured in my Amplify Gen 2 project:

backend.addOutput({
  storage: {
    aws_region: bucket1.env.region,
    bucket_name: bucket1.bucketName,
    // optional: `buckets` can be used when setting up more than one existing bucket
    buckets: [
      {
        aws_region: bucket1.env.region,
        bucket_name: bucket1.bucketName,
        name: bucket1.bucketName,
      },
      {
        aws_region: bucket2.env.region,
        bucket_name: bucket2.bucketName,
        name: bucket2.bucketName,
      },
    ]
  },
});

When using the Amplify storage plugin to upload to the first bucket (bucket1), the upload succeeds without any issues. Uploading to the second bucket (bucket2) results in correct file upload to the bucket, however on the frontend side, the result callback is never called. The progress reports are delivered up to 1.0.

StorageUploadFileOptions options = StorageUploadFileOptions.builder()
                .contentType("image/jpeg")
                .bucket(StorageBucket.fromBucketInfo(new BucketInfo("bucket-2", "us-east-1")))
                .build();


        Amplify.Storage.uploadFile(StoragePath.fromString(file.getName()), file, options,
                progress -> Log.e(TAG, "onProgressChanged: " + progress.getFractionCompleted()),
                result -> {
                    Log.i(TAG, "Successfully uploaded: " + result.getPath());
                    String url = PHOTO_BUCKET_BASEURL + "/" + result.getPath();
                    Log.e(TAG, "URL: " + url);
                    uploadImage(url);
                },
                error -> {
                    Log.e(TAG, "Upload failed", error);
                    Constant.dismissProgress();
                    Toast.makeText(EditProfileActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                });

I do see the progress reports going all the way up to 1, but the logs die there:

2025-11-02 14:24:07.067 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 0.9913283253523364
2025-11-02 14:24:07.068 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 0.9959762158727277
2025-11-02 14:24:07.069 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 1.000624106393119
2025-11-02 14:24:07.070 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 1.0013781403898963
2025-11-02 14:24:07.072 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 1.0014955858656922
2025-11-02 14:24:07.622 22613-22819 WM-WorkerWrapper        com.xxxxxx.xxxxxx                    I  Worker result SUCCESS for Work [ id=b9d435c9-9f8b-4308-a111-df33ed264932, tags={ com.amplifyframework.storage.s3.transfer.worker.RouterWorker, awsS3StoragePlugin, 12, UPLOAD } ]
2025-11-02 14:24:07.629 22613-22819 ConnectivityManager     com.xxxxxx.xxxxxx                    D  StackLog: [android.net.ConnectivityManager.unregisterNetworkCallback(ConnectivityManager.java:5571)] [androidx.work.impl.utils.NetworkApi21.unregisterNetworkCallbackCompat(NetworkApi21.kt:31)] [androidx.work.impl.constraints.trackers.NetworkStateTracker24.stopTracking(NetworkStateTracker.kt:153)] [androidx.work.impl.constraints.trackers.ConstraintTracker.removeListener(ConstraintTracker.kt:72)] [androidx.work.impl.constraints.controllers.ConstraintController$track$1$1.invoke(ContraintControllers.kt:56)] [androidx.work.impl.constraints.controllers.ConstraintController$track$1$1.invoke(ContraintControllers.kt:55)] [kotlinx.coroutines.channels.ProduceKt.awaitClose(Produce.kt:69)] [kotlinx.coroutines.channels.ProduceKt$awaitClose$1.invokeSuspend(Unknown Source:13)] [kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)] [kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:98)] [androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96)] [java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)] [java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)] [java.lang.Thread.run(Thread.java:1119)]
2025-11-02 14:24:07.633 22613-22862 amplify:aw...TransferDB com.xxxxxx.xxxxxx                    I  update state for 12 to COMPLETED
2025-11-02 14:24:07.636 22613-22862 amplify:aw...erObserver com.xxxxxx.xxxxxx                    D  remove observer for 12

Please note that, as mentioned before, the file is uploaded correctly. The only issue is that the result callback is not called.

Reproduction steps (if applicable)

No response

Code Snippet

StorageUploadFileOptions options = StorageUploadFileOptions.builder()
                .contentType("image/jpeg")
                .bucket(StorageBucket.fromBucketInfo(new BucketInfo("bucket-2", "us-east-1")))
                .build();


        Amplify.Storage.uploadFile(StoragePath.fromString(file.getName()), file, options,
                progress -> Log.e(TAG, "onProgressChanged: " + progress.getFractionCompleted()),
                result -> {
                    Log.i(TAG, "Successfully uploaded: " + result.getPath());
                    String url = PHOTO_BUCKET_BASEURL + "/" + result.getPath();
                    Log.e(TAG, "URL: " + url);
                    uploadImage(url);
                },
                error -> {
                    Log.e(TAG, "Upload failed", error);
                    Constant.dismissProgress();
                    Toast.makeText(EditProfileActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                });

Log output

2025-11-02 14:24:07.067 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 0.9913283253523364
2025-11-02 14:24:07.068 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 0.9959762158727277
2025-11-02 14:24:07.069 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 1.000624106393119
2025-11-02 14:24:07.070 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 1.0013781403898963
2025-11-02 14:24:07.072 22613-22613 UploadActivity     com.xxxxxx.xxxxxx                    E  onProgressChanged: 1.0014955858656922
2025-11-02 14:24:07.622 22613-22819 WM-WorkerWrapper        com.xxxxxx.xxxxxx                    I  Worker result SUCCESS for Work [ id=b9d435c9-9f8b-4308-a111-df33ed264932, tags={ com.amplifyframework.storage.s3.transfer.worker.RouterWorker, awsS3StoragePlugin, 12, UPLOAD } ]
2025-11-02 14:24:07.629 22613-22819 ConnectivityManager     com.xxxxxx.xxxxxx                    D  StackLog: [android.net.ConnectivityManager.unregisterNetworkCallback(ConnectivityManager.java:5571)] [androidx.work.impl.utils.NetworkApi21.unregisterNetworkCallbackCompat(NetworkApi21.kt:31)] [androidx.work.impl.constraints.trackers.NetworkStateTracker24.stopTracking(NetworkStateTracker.kt:153)] [androidx.work.impl.constraints.trackers.ConstraintTracker.removeListener(ConstraintTracker.kt:72)] [androidx.work.impl.constraints.controllers.ConstraintController$track$1$1.invoke(ContraintControllers.kt:56)] [androidx.work.impl.constraints.controllers.ConstraintController$track$1$1.invoke(ContraintControllers.kt:55)] [kotlinx.coroutines.channels.ProduceKt.awaitClose(Produce.kt:69)] [kotlinx.coroutines.channels.ProduceKt$awaitClose$1.invokeSuspend(Unknown Source:13)] [kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)] [kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:98)] [androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96)] [java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)] [java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)] [java.lang.Thread.run(Thread.java:1119)]
2025-11-02 14:24:07.633 22613-22862 amplify:aw...TransferDB com.xxxxxx.xxxxxx                    I  update state for 12 to COMPLETED
2025-11-02 14:24:07.636 22613-22862 amplify:aw...erObserver com.xxxxxx.xxxxxx                    D  remove observer for 12

Configuration File

...
"storage": {
    "aws_region": "us-east-1",
    "bucket_name": "bucket-1",
    "buckets": [
      {
        "aws_region": "us-east-1",
        "bucket_name": "bucket-1",
        "name": "bucket-1"
      },
      {
        "aws_region": "us-east-1",
        "bucket_name": "bucket-2",
        "name": "bucket-2"
      }
    ]
  }
...

GraphQL Schema

// Put your schema below this line

Additional information and screenshots

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingstorageRelated to the Storage category/plugins

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions