In the AWS cloud architecture, situations arise where secure communication is needed between an Amazon EKS (Elastic Kubernetes Service) cluster and an Amazon ECR (Elastic Container Registry) in a different AWS account. This blog offers a step-by-step guide on achieving this secure connection using OpenID Connect (OIDC).
OpenID Connect (OIDC) in AWS is like a security superhero that helps different parts of your AWS setup talk to each other safely. It’s like having a trusted guard that ensures only the right components can communicate. With OIDC, you add a special layer of protection, making sure all interactions within your AWS environment are safe and reliable.
We have two accounts: one for ECR (ecr-account) and another for EKS (eks-account). When we were setting up EKS, we turned on something called OIDC. To get details about this OIDC setup for EKS, just use this command:
aws iam get-open-id-connect-provider --open-id-connect-provider-arn <ARN_OF_OIDC_PROVIDER_IN_EKS-ACCOUNT>
output be like,
{
"Url": "oidc.eks.eu-west-1.amazonaws.com/id/C46A4FFABB3E8791A086F3**********",
"ClientIDList": [
"sts.amazonaws.com"
],
"ThumbprintList": [
"9e99a48a9960b14926bb7f3b02e22d**********"
],
"CreateDate": "2023-07-11T06:16:14.841000+00:00",
"Tags": [
{
"Key": "alpha.eksctl.io/eksctl-version",
"Value": "0.148.0"
},
{
"Key": "alpha.eksctl.io/cluster-name",
"Value": "<CLUSTER_NAME> "
}
]
}
The next step is to create an OpenID Connect provider in the ecr-account. This includes using key information from the eks-account, such as the eks-openid URL, client ID, and thumbprints of the OIDC. This connection ensures secure and seamless communication between the two accounts.
aws iam create-open-id-connect-provider \ --url https://oidc.eks.eu-west-1.amazonaws.com/id/C46A4FFABB3E8791A086F3********** \ --client-id-list sts.amazonaws.com \ --thumbprint-list '["9e99a48a9960b14926bb7f3b02e22d**********"]'
With the OpenID Connect provider in the ecr-account set up, now we create an IAM role. This role needs the right AWS ECR policies, and we establish a trusted relationship. Here’s the configuration for the trusted relationship (use the ARN of the created OIDC provider in the ecr-account).
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "<ARN_OF_OIDC_PROVIDER_IN_ECR-ACCOUNT>"
},
"Action": "sts:AssumeRoleWithWebIdentity"
}
]
}
The last step is to go back to the eks-account and create an IAM service account for EKS to link with ECR. We do this using the eksctl command and mentioning the IAM role we made in the ecr-account. Here’s the command:
eksctl create iamserviceaccount \ --cluster <CLUSTER_NAME> \ --region <AWS_REGION> \ --namespace=<NAMESPACE_OF_IAMSERVICEACCOUNT> \ --name=<NAME_OF_IAMSERVICEACCOUNT> \ --attach-role-arn=<RN_OF_IAM-ROLE_IN_THE_ECR-ACCOUNT> \ --approve
After making the IAM service account, include it in the deployment process for pods that need to access the ECR in the ecr-account. Simply add the following annotation to your pod or deployment configuration:
spec: template: spec: serviceAccountName: <IAM_SERVICEACCOUNT>
Please verify that you can now access ECR from EKS.
In short, connecting AWS EKS and ECR in different accounts securely involves a few simple steps. Enable OIDC for EKS, set up an OIDC provider in the ECR-account, create a trusted IAM role, and configure an IAM service account for EKS. This guarantees a strong and safe link for smooth operations, making it easy to deploy and manage applications across AWS accounts in a secure and efficient cloud setup.
