Install Crossplane on AWS with the Jet provider

crossplane kubernetes aws s3 jet provider

3 min read | by Jordi Prats

To start creating resources on AWS we can choose the AWS native provider or go with the Jet provider that uses terraform's AWS provider under the hood to generate a Crossplane provider

If we take a look at the number of CRDs exposes the native AWS provider, we have 124 on the version 0.24.1.

For the AWS Jet provider we have two versions:

  • The versions with just it's number, for example 0.4.0, are the light ones, with just the most heavily used CRDs. For the 0.4.0 version there are 81 CRDs. This versions was created because some K8s versions have difficulties with managing over 700 CRDs
  • The full versions have the -preview suffix, for example 0.4.0-preview. This versions contains all the XRM-conformant managed resources, being 763 CRDs for the fore mentioned 0.4.0-preview

To use the AWS Jet provider we will also need an IAM role to associate with any of the namespace's ServiceAccounts:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::123456789876:oidc-provider/oidc.eks.eu-west-1.amazonaws.com/id/1B45E2E0B2D55D1E1BC9FA13D02A31CD"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "oidc.eks.eu-west-1.amazonaws.com/id/BC91B45B2E0D1F02AD55D1EA13DE231C:sub": "system:serviceaccount:crossplane-system:*"
                }
            }
        }
    ]
}

If we want to use the lightweight version we can configure it as follows:

apiVersion: pkg.crossplane.io/v1alpha1
kind: ControllerConfig
metadata:
  name: jet-aws-config
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789876:role/crossplane
spec:
  podSecurityContext:
    fsGroup: 2000
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: jet-provider-aws
spec:
  package: crossplane/provider-jet-aws:v0.4.0
  controllerConfigRef:
    name: jet-aws-config
---
apiVersion: aws.jet.crossplane.io/v1alpha1
kind: ProviderConfig
metadata:
  name: jet-aws-provider
spec:
  credentials:
    source: InjectedIdentity

Once the provider Pods are ready we can now create the resources, for example an S3 Bucket. Please notice how the apiVersion if different depending on the provider we are using:

apiVersion: s3.aws.jet.crossplane.io/v1alpha2
kind: Bucket
metadata:
  name: pet2cattle-xplane-test
spec:
  providerConfigRef:
    name: jet-aws-provider
  forProvider:
    region: 'eu-west-1'

Using kubectl describe we will be able to check for it's status. If there's some errors we might get terraform errors as well:

$ kubectl describe bucket.s3.aws.jet.crossplane.io/pet2cattle-xplane-test
Name:         pet2cattle-xplane-test
Namespace:    
Labels:       <none>
Annotations:  crossplane.io/external-create-pending: 2022-02-13T19:29:14Z
              crossplane.io/external-create-succeeded: 2022-02-13T19:29:21Z
              crossplane.io/external-name: pet2cattle-xplane-test
              terrajet.crossplane.io/provider-meta: null
API Version:  s3.aws.jet.crossplane.io/v1alpha2
Kind:         Bucket
Metadata:
  (...)
Spec:
  Deletion Policy:  Delete
  For Provider:
    Region:  eu-west-1
  Provider Config Ref:
    Name:  jet-aws-provider
Status:
  At Provider:
  Conditions:
    Last Transition Time:  2022-02-13T19:29:21Z
    Reason:                Creating
    Status:                False
    Type:                  Ready
    Last Transition Time:  2022-02-13T19:29:21Z
    Reason:                ReconcileSuccess
    Status:                True
    Type:                  Synced
Events:
  Type    Reason                   Age   From                                                    Message
  ----    ------                   ----  ----                                                    -------
  Normal  CreatedExternalResource  10s   managed/s3.aws.jet.crossplane.io/v1alpha2, kind=bucket  Successfully requested creation of external resource

Using the AWS cli we can double check that the bucket have been successfully created:

$ aws s3 ls |  grep xplane
2022-02-13 19:29:21 pet2cattle-xplane-test

Posted on 02/03/2022