有没有一种方法可以通过Teradata TPT脚本中的环境变量来处理Amazaon S3凭据



我正在用S3设置我的terdata TPT脚本,并希望在TPT脚本中使用环境文件变量来获得amazon S3凭据,而不是硬编码的Access密钥accessId&区域

有什么想法吗?

DEFINE JOB EXPORT_FROM_TERADATA DESCRIPTION 'Export data from Teradata to Amazon S3' 
( STEP EXPORT_THE_DATA 
( APPLY TO OPERATOR 
( $FILE_WRITER() ATTR 
( AccessModuleName = 'libs3axsmod.so',Format = 'Delimited' , AccessModuleInitStr = 'S3Bucket=nn-model-sagemaker-test S3Region=eu-west-1 S3Object=tpt/testdata S3SinglePartFile=False S3AccessID=AKIZZZZZZZZZZZZZZU S3AccessKey=kxxxxxxxxxxxxxxxx7' ) 
) 
SELECT * FROM OPERATOR ( $EXPORT ATTR ( UserName = @TargetUserName , UserPassword = @TargetUserPassword, TdpId = @TargetTdpId , SelectStmt = 'SELECT TOP 10 * FROM database.table;' ) ); 
); 
);

硬编码凭据在TPT脚本中有效,但变量无效。

( AccessModuleName = 'libs3axsmod.so',Format = 'Delimited' ,
AccessModuleInitStr = 'S3Bucket=@model-test S3Region=S3AXMS3Region S3AccessID=S3AXMS3AccessID S3AccessKey=S3AXMS3AccessKey' ) 

您不能访问TPT脚本中的环境变量,但可以使用命令行上的-u开关让shell将环境变量的值作为TPT脚本变量传递。

tbuild -f scriptfile -u "S3Rgn='$S3AXMS3Region' …"

您可以使用字符串串联来创建AccessModuleInitStr

AccessModuleInitStr='S3Bucket='''||@model-test||''' S3Region='''||@S3Rgn||''' … '

请注意,您可以从凭据文件中获取AccessID和AccessKey,从配置文件中获取Region(只需在Init String中指定相应的S3Profile(。

如果您的导出/导入作业在AWS云中运行,您可以使用IAM roles,这是一种有效的短期凭据。

您可以将IAM角色(实例配置文件(附加到具有必要权限的EC2实例、ECS任务、Lambda等。s3:*将用于启动器,但可以进一步简化为:

  • s3:ListAllMyBuckets
  • s3:GetBucketLocation
  • s3:ListBucket
  • s3:GetObject
  • s3:PutObject
  • s3:DeleteObject

AWS将自动旋转这些凭据,tbuild将拾取它们。

测试.tpt

DEFINE JOB EXPORT_FROM_TERADATA DESCRIPTION 'Export data from Teradata to Amazon S3' (
STEP EXPORT_DATA (
APPLY TO OPERATOR (
$FILE_WRITER() ATTR (
AccessModuleName = 'libs3axsmod.so',
Format = 'Delimited'
)
)
SELECT * FROM OPERATOR (
$EXPORT ATTR (
LogonMech = 'ldap',
UserName = @TargetUserName ,
UserPassword = @TargetUserPassword,
TdpId = @TargetDbIp,
SelectStmt = 'SELECT 10 * FROM @TargetDatabase.@TargetTable;'
)
);
);
);

test.env

TargetDbIp = '10.11.12.13',
TargetUserName = 'dbuser',
TargetUserPassword = '**********',
TargetDatabase = 'database',
TargetTable = 'table',
FileWriterAccessModuleInitStr = 'S3Bucket=my-lovely-bucket S3Region=eu-central-1 S3Object=folder/file.csv S3SinglePartFile=True S3Role=MyIAMRole'

然后从EC2、ECS任务、Kubernetes pod、Lambda等运行tbuild:

$ tbuild -f test.tpt -v test.env

这将把Teradata的database.table表中的数据导出到eu-central-1区域中的s3://my-lovely-bucket/folder/file.csv中。

您可以在此处找到tbuild文档。

最新更新