All of these arguments follow the same pattern.  We could remove some of the duplication with something like this:

```
+class BundleArgument(CustomArgument):
+    def __init__(self, storage_param, *args, **kwargs):
+        super(BundleArgument, self).__init__(*args, **kwargs)
+        self._storage_param = storage_param

     def add_to_params(self, parameters, value):
-        if value:
-            _build_storage(parameters, 'UploadPolicy', value)
+        if value is not None:
+            self._build_storage(parameters, value)
+
+    def _build_storage(self, parameters, value):
+        # Build up the Storage data structure.
+        if 'storage' not in parameters:
+            parameters['storage'] = {'S3': {}}
+        parameters['storage']['S3'][self._storage_param] = value
```

And then just use the same class in `_add_params`:

```
-    arg = BucketArgument(operation, 'bucket',
+    arg = BundleArgument(operation=operation, name='bucket',
+                         storage_param='Bucket',
                          documentation=BUCKET_DOCS)
     argument_table['bucket'] = arg
-    arg = PrefixArgument(operation, 'prefix', documentation=PREFIX_DOCS)
+    arg = BundleArgument(operation=operation, name='prefix',
+                         storage_param='Prefix',
+                         documentation=PREFIX_DOCS)
# ... etc
```