我使用Ansible(v2.9)oracle-ee
模块使用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 }}"
注意:在运行vars_files:
的Playbook期间已提供了所有变量。
任务一旦执行,它就会显示ok: [localhost]
而不是更新RDS实例上的IAM角色。
使用AWS CLI快速检查AssociatedRoles
会显示null
:
$ aws rds describe-db-instances --db-instance-identifier my-db-instance --query "DBInstances[0].AssociatedRoles[0]"
null
根据rds_instance
的Ansible文档,我希望将指定的角色附加到RDS实例(至少在上面的AWS CLI输出中显示),并提供与s3_prefix
匹配的文件。我想念什么吗?
注意:我能够使用AWS CLI附加IAM角色并导入。但是,我希望与Ansible一起为我们将要创建的未来RDS实例工作。
修改:
除了将角色附加到RDS实例之外,我还希望将匹配s3_prefix
的文件从S3存储桶复制到RDS实例。
我调查了DATA_DUMP_DIR
,但其中只有datapump/
个目录(没有*.dmp
个文件)。
答案 0 :(得分:1)
s3_ingestion_role_arn是用于访问s3存储桶以导入s3转储的角色,但它不是永久角色,因此一旦操作完成,角色作业就完成了。
答案 1 :(得分:1)
我提交了一个功能请求以直接在 rds_instance 模块中实现此功能,https://github.com/ansible-collections/community.aws/issues/464
答案 2 :(得分:0)
最终,我不得不使用稍长一些的解决方法,使用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脚本(使用模板)以导入:
任务:
- 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
个文件可用。