我oracle-ee
使用 Ansible (v2.9)rds_instance
模块创建了一个 AWS RDS 实例。后来我意识到我需要一些数据库文件。所以我创建了一个 S3 存储桶并向其中上传了一些.dmp
文件。
我写了一个如下的 Ansible 任务来将 RDS 与 S3“集成”:
- name: Update RDS instance with Role ARN for S3 ingestion
rds_instance:
region: "{{ region }}"
aws_access_key: "{{ aws_access_key_id }}"
aws_secret_key: "{{ aws_secret_access_key }}"
db_instance_identifier: my-db-instance
s3_ingestion_role_arn: "{{ aws_rds_iam_role_arn }}"
s3_bucket_name: "{{ aws_rds_s3_bucket }}"
s3_prefix: db
option_group_name: "{{ aws_rds_option_group }}"
注意:在 Playbook 运行期间提供了所有变量vars_files:
。
任务执行后,它会显示ok: [localhost]
而不是更新 RDS 实例上的 IAM 角色。
AssociatedRoles
使用 AWS CLI 进行快速检查显示null
:
$ aws rds describe-db-instances --db-instance-identifier my-db-instance --query "DBInstances[0].AssociatedRoles[0]"
null
根据 的 Ansible 文档rds_instance
,我希望将指定的角色附加到 RDS 实例(至少显示在上面的 AWS CLI 输出中),并且匹配的文件s3_prefix
可用。我错过了什么吗?
注意:我可以使用 AWS CLI 附加 IAM 角色并导入。但是,我希望在我们将创建的未来 RDS 实例中使用 Ansible。
编辑:
除了附加到 RDS 实例的角色之外,我还希望将匹配的文件s3_prefix
从 S3 存储桶复制到 RDS 实例。我已经调查过,DATA_DUMP_DIR
但里面只有datapump/
目录(没有*.dmp
文件)。
最终,我不得不求助于使用 AWS CLI 命令和 SQL 脚本来从 S3 存储桶下载转储 ( ) 文件的稍微有点长的解决方法*.dmp
。
将带有 S3_INTEGRATION 选项的 IAM 角色附加到 RDS 实例:
- name: Attach IAM role to RDS instance
command: "aws rds add-role-to-db-instance --instance-identifier my-db-instance --feature-name S3_INTEGRATION --role-arn {{ aws_rds_iam_role_arn }}"
register: attach_result
failed_when:
- attach_result.rc > 0
- "'already associated' not in attach_result.stderr"
这确保了授权访问 S3 的 IAM 角色附加到我的 RDS 实例。
下一步是导入。但在此之前,我会验证该角色是否存在且处于活动状态。
- name: Verify IAM role with S3_INTEGRATION is present
command: aws cli describe-db-instances --instance-identifier my-db-instance --query DBInstances[0].AssociatedRole[0].FeatureName --output json
register: verify_iam_role
- name: Fail if S3_INTEGRATION is not present
fail:
msg: "S3_INTEGRATION is not available."
when: "'S3_INTEGRATION' not in verify_iam_role.stdout"
创建 SQL 脚本(使用模板)以导入:
Ansible 任务:
- name: Create SQL script to copy from S3
template:
src: copy-from-s3.sql.j2
dest: /tmp/copy-from-s3.sql
SQL 脚本:
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(p_bucket_name => 'my-s3-bucket', p_s3_prefix => 'db_', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;
最后运行SQL脚本:
- name: Run SQL script
command: "sqlplus dbuser/dbpasswd@my-db-instance-endpoint:1521 @/tmp/copy-from-s3.sql"
这会生成一个带有任务 ID 的日志文件。完成状态在文件中更新。现在db_*.dmp
文件可用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句