Establishing a Connection
With the CData Cmdlets users can install a data module, set the connection properties, and start scripting. This section provides examples of using our AmazonS3 Cmdlets with native PowerShell cmdlets, like the CSV import and export cmdlets.
Connecting to Amazon S3
Specify the following to connect to data:
- CustomURL: Specify the base S3 service URL if it has a different URL from 'amazonaws.com'. Make sure to specify the full URL. For example: 'http://127.0.0.1:9000'.
- AWSRegion: Set this to the region where your Amazon S3 data is hosted.
Authenticating to Amazon S3
There are several authentication methods available for connecting to Amazon S3 including: authenticating with Root Credentials, Temporary Credentials, as an AWS Role (from an EC2 Instance or by specifying the root credentials), using SSO and using a Credential File.
Obtain AWS Keys
To obtain the credentials for an IAM user:- Sign into the IAM console.
- In the navigation pane, select Users.
- To create or manage the access keys for a user, select the user and then navigate to the Security Credentials tab.
- Sign into the AWS Management console with the credentials for your root account.
- Select your account name or number.
- In the menu that displays, select My Security Credentials.
- To manage or create root account access keys, click Continue to Security Credentials and expand the "Access Keys" section.
Root Credentials
To authenticate using account root credentials, set these parameters:
- AuthScheme: AwsRootKeys.
- AWSAccessKey: The access key associated with the AWS root account.
- AWSSecretKey: The secret key associated with the AWS root account.
Note: Amazon discourages the use of this authentication scheme for anything but simple tests. The account root credentials have the full permissions of the user, making this the least secure authentication method.
If multi-factor authentication is required, specify the following:
- CredentialsLocation: The location of the settings file where MFA credentials are saved. See the Credentials File Location page under Connection String Options for more information.
- MFASerialNumber: The serial number of the MFA device if one is being used.
- MFAToken: The temporary token available from your MFA device.
Note: If you want to control the duration of the temporary credentials, set the TemporaryTokenDuration property (default: 3600 seconds).
Temporary Credentials
To authenticate using temporary credentials, specify the following:
- AuthScheme: TemporaryCredentials.
- AWSAccessKey: The access key of the IAM user who will assume the role.
- AWSSecretKey: The secret key of the IAM user who will assume the role.
- AWSSessionToken: Your AWS session token, provided with your temporary credentials. For details, see AWS Identity and Access Management User Guide.
The cmdlet can now request resources using the same permissions provided by long-term credentials (such as IAM user credentials) for the lifespan of the temporary credentials.
To authenticate using both temporary credentials and an IAM role, set all the parameters described above, and specify these additional parameters:
- AWSRoleARN: The Role ARN for the role you'd like to authenticate with. This prompts the cmdlet to retrieve credentials for the specified role.
- AWSExternalId (optional): Only required if you are assuming a role in another AWS account.
If multi-factor authentication is required, specify the following:
- CredentialsLocation: The location of the settings file where MFA credentials are saved. See the Credentials File Location page under Connection String Options for more information.
- MFASerialNumber: The serial number of the MFA device if one is being used.
- MFAToken: The temporary token available from your MFA device.
Note: If you want to control the duration of the temporary credentials, set the TemporaryTokenDuration property (default: 3600 seconds).
Using AWS From an EC2 Instance
Set AuthScheme to AwsEC2Roles.
If you are using the cmdlet from an EC2 Instance and have an IAM Role assigned to the instance, you can use the IAM Role to authenticate. Since the cmdlet automatically obtains your IAM Role credentials and authenticates with them, it is not necessary to specify AWSAccessKey and AWSSecretKey.
If you are also using an IAM role to authenticate, you must additionally specify the following:
- AWSRoleARN: Specify the Role ARN for the role you'd like to authenticate with. This will cause the cmdlet to attempt to retrieve credentials for the specified role.
- AWSExternalId (optional): Only required if you are assuming a role in another AWS account.
IMDSv2 Support
The Amazon S3 cmdlet now supports IMDSv2. Unlike IMDSv1, the new version requires an authentication token. Endpoints and response are the same in both versions.
In IMDSv2, the Amazon S3 cmdlet first attempts to retrieve the IMDSv2 metadata token and then uses it to call AWS metadata endpoints. If it is unable to retrieve the token, the cmdlet reverts to IMDSv1.
AWS Web Identity
Set AuthScheme to AwsWebIdentity.
If you are either using Amazon S3 from a container configured to assume role with web identity (such as a Pod in an EKS cluster with an OpenID Provider) OR have authenticated with a web identity provider associated with an IAM role (and have thus obtained an identity token), you can exchange the web identity token and IAM role information for temporary security credentials to authenticate and access AWS services.
If the container has AWS_ROLE_ARN and AWS_WEB_IDENTITY_TOKEN_FILE specified in the environment variables, Amazon S3 automatically obtains the credentials.
You can also authenticate by specifying both AWSRoleARN and AWSWebIdentityToken to execute the AssumeRoleWithWebIdentity API operation.
AWS IAM Roles
To authenticate through AWS, set AuthScheme to AwsIAMRoles.
To authenticate as an AWS role, set these properties:
- AWSAccessKey: The access key of the IAM user to assume the role for.
- AWSSecretKey: The secret key of the IAM user to assume the role for.
- AWSRoleARN: Specify the Role ARN for the role you'd like to authenticate with. This will cause the cmdlet to attempt to retrieve credentials for the specified role.
- AWSExternalId (optional): Only required if you are assuming a role in another AWS account.
If multi-factor authentication is required, specify the following:
- CredentialsLocation: The location of the settings file where MFA credentials are saved. See the Credentials File Location page under Connection String Options for more information.
- MFASerialNumber: The serial number of the MFA device if one is being used.
- MFAToken: The temporary token available from your MFA device.
Note: If you want to control the duration of the temporary credentials, set the TemporaryTokenDuration property (default: 3600 seconds).
Note: In some circumstances it might be preferable to use an IAM role for authentication, rather than the direct security credentials of an AWS root user. If you are specifying the AWSAccessKey and AWSSecretKey of an AWS root user, you cannot use roles.
ADFS
To connect to ADFS, set these properties:
- AuthScheme: ADFS.
- User: The authenticating ADFS user.
- Password: The password of the authenticating ADFS user.
- SSOLoginURL: The SSO provider's login URL.
Example connection string:
AuthScheme=ADFS; AWSRegion=Ireland; [email protected]; Password=CH8WerW121235647iCa6; SSOLoginURL='https://adfs.domain.com'; AWSRoleArn=arn:aws:iam::1234:role/ADFS_SSO; AWSPrincipalArn=arn:aws:iam::1234:saml-provider/ADFSProvider;
ADFS Integrated
The ADFS Integrated flow indicates you are connecting with the user credentials of the currently logged in Windows user. To use the ADFS Integrated flow, do not specify the User and Password, but otherwise follow the same steps noted above under ADFS.
Okta
To connect to Okta, set these properties:
- AuthScheme: Okta.
- User: The authentiating Okta user.
- Password: The password of the authenticating Okta user.
- SSOLoginURL: The SSO provider's login URL.
If you are either using a trusted application or proxy that overrides the Okta client request OR configuring MFA, you must use combinations of SSOProperties to authenticate using Okta. Set any of the following, as applicable:
- APIToken: When authenticating a user via a trusted application or proxy that overrides the Okta client request context, set this to the API Token the customer created from the Okta organization.
- MFAType: If you have configured the MFA flow, set this to one of the following supported types: OktaVerify, Email, or SMS.
- MFAPassCode: If you have configured the MFA flow, set this to a valid passcode.
If you set this to empty or an invalid value, the cmdlet issues a one-time password challenge to your device or email. After the passcode is received, reopen the connection where the retrieved one-time password value is set to the MFAPassCode connection property. - MFARememberDevice: True by default. Okta supports remembering devices when MFA is required. If remembering devices is allowed according to the configured authentication policies, the cmdlet sends a device token to extend MFA authentication lifetime. If you do not want MFA to be remembered, set this variable to False.
Example connection string:
AuthScheme=Okta; AWSRegion=Ireland; [email protected]; Password=CH8WerW121235647iCa6; SSOLoginURL='https://cdata-us.okta.com/home/amazon_aws/0oa35m8arsAL5f5NrE6NdA356/272'; SSOProperties='ApiToken=01230GGG2ceAnm_tPAf4MhiMELXZ0L0N1pAYrO1VR-hGQSf;'; AWSRoleArn=arn:aws:iam::1234:role/Okta_SSO; AWSPrincipalARN=arn:aws:iam::1234:saml-provider/OktaProvider;
PingFederate
To connect to PingFederate, set these properties:- AuthScheme: PingFederate.
- User: The authenticating PingFederate user.
- Password: The authenticating user's PingFederate password.
- SSOLoginURL: The SSO provider's login URL.
- AWSRoleARN (optional): If you have multiple role ARNs, specify the one you want to use for authorization.
- AWSPrincipalARN (optional): If you have multiple principal ARNs, specify the one you want to use for authorization.
- SSOExchangeURL: The Partner Service Identifier URI configured in your PingFederate server instance under: SP Connections > SP Connection > WS-Trust > Protocol Settings. This should uniquely identify a PingFederate SP Connection, so it is a good idea to set it to your AWS SSO ACS URL. You can find it under AWS SSO > Settings > View Details next to the Authentication field.
- SSOProperties (optional): If you want to include your username and password as an authorization header in requests to Amazon S3, set this to Authscheme=Basic.
To enable mutual SSL authentication for SSOLoginURL, the WS-Trust STS endpoint, configure these SSOProperties:
Example connection string:
authScheme=pingfederate;SSOLoginURL=https://mycustomserver.com:9033/idp/sts.wst;SSOExchangeUrl=https://us-east-1.signin.aws.amazon.com/platform/saml/acs/764ef411-xxxxxx;user=admin;password=PassValue;AWSPrincipalARN=arn:aws:iam::215338515180:saml-provider/pingFederate;AWSRoleArn=arn:aws:iam::215338515180:role/SSOTest2;
Credentials Files
You can use any credentials file to authenticate, including any configurations related to AccessKey/SecretKey authentication, temporary credentials, role authentication, or MFA.
To do this, set these properties:
- AuthScheme: AwsCredentialsFile.
- AWSCredentialsFile: The location of your credentials file.
- AWSCredentialsFileProfile (optional): The name of the profile you would like to use from the specified credentials file. If not specified, the default profile is used.
AWS Cognito Credentials
If you want to use the cmdlet with a user registered in a User Pool in AWS Cognito, set these properties:
- AuthScheme: Either AwsCognitoSrp (recommended) or AwsCognitoBasic.
- AWSCognitoRegion: The User Pool region.
- AWSUserPoolId: The User Pool ID.
- AWSUserPoolClientAppId: The User Pool Client App ID.
- AWSUserPoolClientAppSecret: The User Pool Client Secret.
- AWSIdentityPoolId: The Identity Pool ID of the Identity Pool that is linked with the User Pool.
- User: The username of the user registered in the User Pool.
- Password: The password of the user registered in the User Pool.
Connecting to Amazon S3 through VPC Endpoints
In secure or isolated environments without internet access, you can route requests to Amazon S3 and AWS STS through VPC endpoints configured via AWS PrivateLink.
To configure this set the following properties:
- CustomURL: Use this property to specify the VPC endpoint URL for Amazon S3.
- STSEndpointOverride: If using IAM roles for authentication, use this property to override the default STS endpoint with a VPC endpoint.
Note: Make sure the VPC endpoint is properly configured and reachable, and that Private DNS is enabled in your AWS VPC settings.
Creating a Connection Object
You can then use the Connect-AmazonS3 cmdlet to create a connection object that can be passed to other cmdlets:
$conn = Connect-AmazonS3 AWSAccessKey "a123" -AWSSecretKey "s123"
Retrieving Data
The Select-AmazonS3 cmdlet provides a native PowerShell interface for retrieving data:
$results = Select-AmazonS3 -Connection $conn -Table "Buckets" -Columns @("Name, OwnerId") -Where "Name='TestBucket'"
The Invoke-AmazonS3 cmdlet provides an SQL interface. This cmdlet can be used to execute an SQL query via the Query parameter.
Piping Cmdlet Output
The cmdlets return row objects to the pipeline one row at a time. The following line exports results to a CSV file:
Select-AmazonS3 -Connection $conn -Table Buckets -Where "Name = 'TestBucket'" | Select -Property * -ExcludeProperty Connection,Table,Columns | Export-Csv -Path c:\myBucketsData.csv -NoTypeInformation
You will notice that we piped the results from Select-AmazonS3 into a Select-Object cmdlet and excluded some properties before piping them into an Export-CSV cmdlet. We do this because the CData Cmdlets append Connection, Table, and Columns information onto each row object in the result set, and we do not necessarily want that information in our CSV file.
However, this makes it easy to pipe the output of one cmdlet to another. The following is an example of converting a result set to JSON:
PS C:\> $conn = Connect-AmazonS3 AWSAccessKey "a123" -AWSSecretKey "s123"
PS C:\> $row = Select-AmazonS3 -Connection $conn -Table "Buckets" -Columns (Name, OwnerId) -Where "Name = 'TestBucket'" | select -first 1
PS C:\> $row | ConvertTo-Json
{
"Connection": {
},
"Table": "Buckets",
"Columns": [
],
"Name": "MyName",
"OwnerId": "MyOwnerId"
}