Il problema principale qui è che è necessario 1) aggiungere un ruolo IAM all'istanza RDS per accedere al bucket S3 e 2) aggiungere un endpoint S3 al VPC in cui viene eseguita l'istanza RDS per consentire le comunicazioni.
Questa è la procedura che ho seguito per farlo funzionare, utilizzando i comandi cli di AWS in una shell (prendere cura di valutare adeguatamente le variabili ambientali coinvolte), spero possa essere d'aiuto:
- Crea il ruolo 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"}]}'
- Crea la policy IAM che sarà collegata al ruolo 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}/*"]}]}'
- Allega la politica:
$ aws iam attach-role-policy \
--policy-arn arn:aws:iam::$AWS_ACCOUNT_ID:policy/$POLICY_NAME \
--role-name $ROLE_NAME
- Aggiungi il ruolo a un'istanza specifica:questo passaggio deve essere ripetuto per ogni nuova istanza:
$ 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
- Crea l'endpoint VPC per il servizio S3:
$ aws ec2 create-vpc-endpoint \
--vpc-id $VPC_ID \
--service-name com.amazonaws.$REGION.s3
--route-table-ids $ROUTE_TABLE_ID
L'ID della tabella di instradamento relativo al VPC in cui viene creato l'endpoint può essere recuperato tramite il comando
$ aws ec2 describe-route-tables | jq -r '.RouteTables[] | "\(.VpcId) \(.RouteTableId)"'