El problema principal aquí es que debe 1) agregar un rol de IAM a la instancia de RDS para acceder al depósito de S3 y 2) agregar un punto de enlace de S3 a la VPC donde se ejecuta la instancia de RDS para permitir las comunicaciones.
Este es el procedimiento que seguí para hacerlo funcionar, usando los comandos AWS cli en un shell (cuidar el valor adecuado de las variables ambientales involucradas), espero que pueda ayudar:
- Cree el rol de IAM:
$ aws iam create-role \
--role-name $ROLE_NAME \
--assume-role-policy-document '{"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Principal": {"Service": "rds.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
- Cree la política de IAM que se adjuntará al rol de IAM:
$ aws iam create-policy \
--policy-name $POLICY_NAME \
--policy-document '{"Version": "2012-10-17", "Statement": [{"Sid": "s3import", "Action": ["s3:GetObject", "s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::${BUCKET_NAME}", "arn:aws:s3:::${BUCKET_NAME}/*"]}]}'
- Adjunte la política:
$ aws iam attach-role-policy \
--policy-arn arn:aws:iam::$AWS_ACCOUNT_ID:policy/$POLICY_NAME \
--role-name $ROLE_NAME
- Agregue el rol a una instancia específica:este paso debe repetirse para cada nueva instancia:
$ aws rds add-role-to-db-instance \
--db-instance-identifier $RDS_INSTANCE_NAME \
--feature-name s3Import \
--role-arn arn:aws:iam::$AWS_ACCOUNT_ID:role/$ROLE_NAME \
--region $REGION
- Cree el punto de enlace de la VPC para el servicio S3:
$ aws ec2 create-vpc-endpoint \
--vpc-id $VPC_ID \
--service-name com.amazonaws.$REGION.s3
--route-table-ids $ROUTE_TABLE_ID
La identificación de la tabla de rutas relacionada con la VPC donde se crea el punto de enlace se puede recuperar a través del comando
$ aws ec2 describe-route-tables | jq -r '.RouteTables[] | "\(.VpcId) \(.RouteTableId)"'