使用Ansible将IAM角色附加到AWS RDS实例

时间:2020-07-21 08:32:20

标签: ansible amazon-rds

我使用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个文件)。

3 个答案:

答案 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个文件可用。