{"id":50886040,"url":"https://github.com/hops-ops/aws-efs-stack","last_synced_at":"2026-06-15T17:02:21.021Z","repository":{"id":363697184,"uuid":"1264517484","full_name":"hops-ops/aws-efs-stack","owner":"hops-ops","description":"AWS EFS storage Crossplane stack for Hops","archived":false,"fork":false,"pushed_at":"2026-06-10T00:51:27.000Z","size":29,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-10T02:15:47.849Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go Template","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hops-ops.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-10T00:36:35.000Z","updated_at":"2026-06-10T00:48:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hops-ops/aws-efs-stack","commit_stats":null,"previous_names":["hops-ops/aws-efs-stack"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/hops-ops/aws-efs-stack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hops-ops%2Faws-efs-stack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hops-ops%2Faws-efs-stack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hops-ops%2Faws-efs-stack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hops-ops%2Faws-efs-stack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hops-ops","download_url":"https://codeload.github.com/hops-ops/aws-efs-stack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hops-ops%2Faws-efs-stack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34372130,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-15T17:02:20.012Z","updated_at":"2026-06-15T17:02:21.016Z","avatar_url":"https://github.com/hops-ops.png","language":"Go Template","funding_links":[],"categories":[],"sub_categories":[],"readme":"# aws-efs-stack\n\n`EFSStorageStack` (`efsstoragestacks.aws.hops.ops.com.ai`) provisions Amazon\nEFS shared storage for EKS workloads, installs the EFS CSI managed add-on by\ndefault, and creates Kubernetes `StorageClass` resources for RWX PVCs.\n\n## Why EFSStorageStack?\n\nGitKB and similar workloads need shared `ReadWriteMany` storage that survives\npod replacement and can be mounted from more than one node. EKS Auto Mode ships\nthe EBS CSI driver, but EBS volumes are not RWX. This stack keeps EFS separate\nfrom cluster creation so storage can be added, imported, or replaced without\nchanging `AutoEKSCluster`.\n\nWith this stack:\n\n- An encrypted EFS file system is created by default.\n- Data-bearing file systems omit `Delete` from `managementPolicies` by default.\n- Existing file systems can be imported with observe-only policies.\n- Mount targets are created for each configured subnet.\n- A mount target security group allows NFS TCP 2049 from client security groups.\n- The `aws-efs-csi-driver` EKS managed add-on is installed unless disabled.\n- Pod Identity grants the CSI controller the AWS managed EFS CSI policy.\n- Kubernetes `StorageClass` objects default to `reclaimPolicy: Retain`.\n\n## Getting Started\n\nCreate EFS storage for a platform cluster:\n\n```yaml\napiVersion: aws.hops.ops.com.ai/v1alpha1\nkind: EFSStorageStack\nmetadata:\n  name: gitkb\n  namespace: default\nspec:\n  region: us-east-2\n  cluster:\n    name: platform\n  network:\n    vpcId: vpc-0123456789abcdef0\n    subnetIds:\n      - subnet-0123456789abcdef0\n      - subnet-0fedcba9876543210\n    clientSecurityGroupIds:\n      - sg-0123456789abcdef0\n```\n\nThe default `StorageClass` is named `efs-gitkb` and uses dynamic EFS access\npoints:\n\n```text\nprovisioner: efs.csi.aws.com\nreclaimPolicy: Retain\nparameters.fileSystemId: \u003cobserved EFS file system ID\u003e\nparameters.provisioningMode: efs-ap\n```\n\n## Data Safety\n\nThe file system is data-bearing. By default the stack renders:\n\n```yaml\nspec:\n  fileSystem:\n    managementPolicies:\n      - Create\n      - Observe\n      - Update\n      - LateInitialize\n```\n\n`Delete` is intentionally omitted. Imported file systems default to\n`[\"Observe\", \"LateInitialize\"]`. StorageClasses default to\n`reclaimPolicy: Retain` so PVC deletion does not delete the backing EFS access\npoint data unexpectedly.\n\n## Import Existing EFS\n\nUse `create: false` with an EFS file system ID. If you also want to use an\nexisting mount-target security group, set `manageSecurityGroup: false`.\n\n```yaml\nspec:\n  fileSystem:\n    create: false\n    externalName: fs-0123456789abcdef0\n  security:\n    manageSecurityGroup: false\n    securityGroupId: sg-0fedcba9876543210\n```\n\n## Existing CSI Driver\n\nDisable managed add-on and Pod Identity rendering when the cluster already\ninstalls and authorizes the EFS CSI driver:\n\n```yaml\nspec:\n  cluster:\n    addon:\n      installEfsCsiDriver: false\n    podIdentity:\n      enabled: false\n  csi:\n    mode: existing\n    podIdentity:\n      enabled: false\n```\n\n## StorageClasses\n\nOmit `storageClasses` to get one non-default class named `efs-gitkb`. Set an\nempty list to disable StorageClass rendering:\n\n```yaml\nspec:\n  storageClasses: []\n```\n\n## Live Smoke\n\nThe e2e test in `tests/e2etest-efsstoragestack` expects a real EKS cluster,\nprovider credentials, and target kubeconfig. It creates a PVC, a writer Job, and\na reader Job that mounts the same claim and verifies the written probe file.\n\nPrepare local inputs:\n\n```text\ntests/e2etest-efsstoragestack/secrets/aws-creds\ntests/e2etest-efsstoragestack/secrets/target-kubeconfig\ntests/e2etest-efsstoragestack/env/AWS_REGION\ntests/e2etest-efsstoragestack/env/EKS_CLUSTER_NAME\ntests/e2etest-efsstoragestack/env/VPC_ID\ntests/e2etest-efsstoragestack/env/PRIVATE_SUBNET_ID_A\ntests/e2etest-efsstoragestack/env/PRIVATE_SUBNET_ID_B\ntests/e2etest-efsstoragestack/env/EKS_CLIENT_SECURITY_GROUP_ID\n```\n\nRun:\n\n```sh\nmake e2e\n```\n\n## Development\n\n```sh\nmake render\nmake validate\nmake test\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhops-ops%2Faws-efs-stack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhops-ops%2Faws-efs-stack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhops-ops%2Faws-efs-stack/lists"}