S3 Support
When installed with the S3 addon spock
will attempt to identify S3 URI(s) (e.g. s3://<bucket-name>/<key>
) and handle
them automatically. The user only needs to provide an active boto3.session.Session
to an S3Config
object and pass
it to the SpockBuilder
.
#
InstallingInstall spock
with the extra s3 related dependencies.
pip install spock-config[s3]
#
Creating a boto3 SessionThe user must provide an active boto3.session.Session
object to spock
in order for the library to automatically
handle S3 URI(s). Configuration is highly dependent upon your current AWS setup/security. Please refer to the
boto3
docs for session and
credentials for help on how to
correctly configure your boto3.session.Session
.
For instance, let's just suppose we are going to get our tokens via SAML authorization where we already have the SAMLAssertion, RoleArn, and PrincipalArn stored as env variables:
import boto3import os
client = boto3.client('sts')
token = client.assume_role_with_saml( RoleArn=os.environ.get("RoleArn"), PrincipalArn=os.environ.get("PrincipalArn"), SAMLAssertion=os.environ.get("SamlString"))
credentials = token['Credentials']
session = boto3.Session( aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'], region_name=os.environ.get('AWS_REGION'))
#
Using the S3Config ObjectAs an example let's create a basic @spock
decorated class, instantiate a S3Config
object from spock.addons.s3
with
the boto3.session.Session
we created above, and pass it to the SpockBuilder
.
from spock.addons.s3 import S3Configfrom spock import SpockBuilderfrom spock import spockfrom typing import List
@spockclass BasicConfig: """Basic spock configuration for example purposes
Attributes: parameter: simple boolean that flags rounding fancy_parameter: parameter that multiplies a value fancier_parameter: parameter that gets added to product of val and fancy_parameter most_fancy_parameter: values to apply basic algebra to
""" parameter: bool fancy_parameter: float fancier_parameter: float most_fancy_parameter: List[int]
def main(): # Create an S3Config object and pass in the boto3 session s3_config = S3Config( session=session ) # Chain the generate function to the SpockBuilder call # Pass in the S3Config object config = SpockBuilder( BasicConfig, desc='S3 example', s3_config=s3_config ).generate()
#
Defining the configuration file with a S3 URIUsually we pass a relative or absolute system path as the configuration file command line argument. Here we pass in a S3 URI instead:
python simple.py -c s3://my-bucket/path/to/file/config.yaml
With a S3Config
object passed into the SpockBuilder
the S3 URI will automatically be handled by spock
.
#
Saving to a S3 URISimilarly, we usually pass a relative or absolute system path to the SavePath
special argument type or
to the user_specified_path
kwarg. Again, instead we give a S3 URI:
def main(): # Create an S3Config object and pass in the boto3 session s3_config = S3Config( session=session ) # Chain the generate function to the SpockBuilder call # Pass in the S3Config object config = SpockBuilder( BasicConfig, desc='S3 example', s3_config=s3_config ).save(user_specified_path="s3://my-bucket/path/to/file/").generate()
With a S3Config
object passed into the SpockBuilder
the S3 URI will automatically be handled by spock
.
#
S3Transfer ExtraArgsIf you require any other settings for uploading or downloading files from S3 the S3Config
class has two extra
attributes:
download_config
which takes a S3DownloadConfig
object from spock.addons.s3
which supports all ExtraArgs from
S3Transfer.ALLOWED_DOWNLOAD_ARGS
upload_config
which takes a S3UploadConfig
object from spock.addons.s3
which supports all ExtraArgs from
S3Transfer.ALLOWED_UPLOAD_ARGS