tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.{
"command": "echo \"AWS_ENDPOINT_URL=$AWS_ENDPOINT_URL\"; echo \"ENFORCE_IAM=$ENFORCE_IAM\"; aws --version; ls /app",
"description": "Check environment"
}AWS_ENDPOINT_URL=http://localstack:4566 ENFORCE_IAM= aws-cli/2.34.45 Python/3.14.4 Linux/6.10.14-linuxkit exe/aarch64.ubuntu.24 [stdout] AWS_ENDPOINT_URL=http://localstack:4566 ENFORCE_IAM= aws-cli/2.34.45 Python/3.14.4 Linux/6.10.14-linuxkit exe/aarch64.ubuntu.24
{
"command": "ls -la /app 2>&1; echo \"---\"; ls -la / 2>&1 | head -30",
"description": "Check working directory"
}total 8 drwxr-xr-x 2 root root 4096 May 8 21:14 . drwxr-xr-x 1 root root 4096 May 8 21:39 .. --- total 76 drwxr-xr-x 1 root root 4096 May 8 21:39 . drwxr-xr-x 1 root root 4096 May 8 21:39 .. -rwxr-xr-x 1 root root 0 May 8 21:39 .dockerenv drwxr-xr-x 2 root root 4096 May 8 21:14 app lrwxrwxrwx 1 root root 7 Apr 22 2024 bin -> usr/bin drwxr-xr-x 2 root root 4096 Apr 22 2024 boot drwxr-xr-x 5 root root 340 May 8 21:39 dev drwxr-xr-x 1 root root 4096 May 8 21:39 etc drwxr-xr-x 3 root root 4096 Apr 10 02:32 home drwxr-xr-x 2 root root 4096 May 8 21:39 installed-agent lrwxrwxrwx 1 root root 7 Apr 22 2024 lib -> usr/lib drwxr-xr-x 5 root root 4096 May 8 21:39 logs drwxr-xr-x 2 root root 4096 Apr 10 02:23 media drwxr-xr-x 2 root root 4096 Apr 10 02:23 mnt drwxr-xr-x 1 root root 4096 May 8 21:14 opt dr-xr-xr-x 249 root root 0 May 8 21:39 proc drwx------ 1 root root 4096 May 8 21:39 root drwxr-xr-x 4 root root 4096 Apr 10 02:32 run lrwxrwxrwx 1 root root 8 Apr 22 2024 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Apr 10 02:23 srv dr-xr-xr-x 11 root root 0 May 8 21:39 sys drwxrwxrwt 1 root root 4096 May 8 21:40 tmp drwxr-xr-x 1 root root 4096 Apr 10 02:23 usr drwxr-xr-x 1 root root 4096 Apr 10 02:32 var [stdout] total 8 drwxr-xr-x 2 root root 4096 May 8 21:14 . drwxr-xr-x 1 root root 4096 May 8 21:39 .. --- total 76 drwxr-xr-x 1 root root 4096 May 8 21:39 . drwxr-xr-x 1 root root 4096 May 8 21:39 .. -rwxr-xr-x 1 root root 0 May 8 21:39 .dockerenv drwxr-xr-x 2 root root 4096 May 8 21:14 app lrwxrwxrwx 1 root root 7 Apr 22 2024 bin -> usr/bin drwxr-xr-x 2 root root 4096 Apr 22 2024 boot drwxr-xr-x 5 root root 340 May 8 21:39 dev drwxr-xr-x 1 root root 4096 May 8 21:39 etc drwxr-xr-x 3 root root 4096 Apr 10 02:32 home drwxr-xr-x 2 root root 4096 May 8 21:39 installed-agent lrwxrwxrwx 1 root root 7 Apr 22 2024 lib -> usr/lib drwxr-xr-x 5 root root 4096 May 8 21:39 logs drwxr-xr-x 2 root root 4096 Apr 10 02:23 media drwxr-xr-x 2 root root 4096 Apr 10 02:23 mnt drwxr-xr-x 1 root root 4096 May 8 21:14 opt dr-xr-xr-x 249 root root 0 May 8 21:39 proc drwx------ 1 root root 4096 May 8 21:39 root drwxr-xr-x 4 root root 4096 Apr 10 02:32 run lrwxrwxrwx 1 root root 8 Apr 22 2024 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Apr 10 02:23 srv dr-xr-xr-x 11 root root 0 May 8 21:39 sys drwxrwxrwt 1 root root 4096 May 8 21:40 tmp drwxr-xr-x 1 root root 4096 Apr 10 02:23 usr drwxr-xr-x 1 root root 4096 Apr 10 02:32 var
{
"command": "aws --endpoint-url=$AWS_ENDPOINT_URL sts get-caller-identity 2>&1",
"description": "Check AWS credentials"
}{
"UserId": "000000000000",
"Account": "000000000000",
"Arn": "arn:aws:iam::000000000000:root"
}
[stdout]
{
"UserId": "000000000000",
"Account": "000000000000",
"Arn": "arn:aws:iam::000000000000:root"
}{
"command": "aws --endpoint-url=$AWS_ENDPOINT_URL ec2 describe-availability-zones --region us-east-1 --query 'AvailabilityZones[].ZoneName' 2>&1 | head -5",
"description": "Check availability zones"
}[
"us-east-1a",
"us-east-1b",
"us-east-1c",
"us-east-1d",
[stdout]
[
"us-east-1a",
"us-east-1b",
"us-east-1c",
"us-east-1d",{
"file_path": "/app/build.sh",
"content": "#!/usr/bin/env bash\nset -euo pipefail\n\nAWS=\"aws --endpoint-url=${AWS_ENDPOINT_URL} --region us-east-1\"\nACCOUNT=\"000000000000\"\nREGION=\"us-east-1\"\n\n# ---------- VPC + subnets ----------\necho \"=== VPC ===\"\nVPC_ID=$($AWS ec2 create-vpc --cidr-block 10.50.0.0/16 \\\n --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=vpc-shared-fs}]' \\\n --query 'Vpc.VpcId' --output text)\necho \"VPC_ID=$VPC_ID\"\n\nSUBNET_A=$($AWS ec2 create-subnet --vpc-id \"$VPC_ID\" --cidr-block 10.50.1.0/24 \\\n --availability-zone us-east-1a \\\n --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=sn-shared-fs-1a}]' \\\n --query 'Subnet.SubnetId' --output text)\nSUBNET_B=$($AWS ec2 create-subnet --vpc-id \"$VPC_ID\" --cidr-block 10.50.2.0/24 \\\n --availability-zone us-east-1b \\\n --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=sn-shared-fs-1b}]' \\\n --query 'Subnet.SubnetId' --output text)\necho \"SUBNETS: $SUBNET_A $SUBNET_B\"\n\n# ---------- Security groups ----------\necho \"=== Security groups ===\"\nSG_APP=$($AWS ec2 create-security-group --vpc-id \"$VPC_ID\" \\\n --group-name sg-app-tier --description \"App tier callers\" \\\n --tag-specifications 'ResourceType=security-group,Tags=[{Key=Name,Value=sg-app-tier}]' \\\n --query 'GroupId' --output text)\nSG_LAMBDA=$($AWS ec2 create-security-group --vpc-id \"$VPC_ID\" \\\n --group-name sg-lambda --description \"Lambda VPC interface\" \\\n --tag-specifications 'ResourceType=security-group,Tags=[{Key=Name,Value=sg-lambda}]' \\\n --query 'GroupId' --output text)\nSG_EFS=$($AWS ec2 create-security-group --vpc-id \"$VPC_ID\" \\\n --group-name sg-efs-mount --description \"EFS mount targets\" \\\n --tag-specifications 'ResourceType=security-group,Tags=[{Key=Name,Value=sg-efs-mount}]' \\\n --query 'GroupId' --output text)\necho \"SG_APP=$SG_APP SG_LAMBDA=$SG_LAMBDA SG_EFS=$SG_EFS\"\n\n$AWS ec2 authorize-security-group-ingress --group-id \"$SG_EFS\" \\\n --ip-permissions \"IpProtocol=tcp,FromPort=2049,ToPort=2049,UserIdGroupPairs=[{GroupId=$SG_APP}]\" >/dev/null\n$AWS ec2 authorize-security-group-ingress --group-id \"$SG_EFS\" \\\n --ip-permissions \"IpProtocol=tcp,FromPort=2049,ToPort=2049,UserIdGroupPairs=[{GroupId=$SG_LAMBDA}]\" >/dev/null\n\n# ---------- KMS CMKs ----------\necho \"=== KMS CMKs ===\"\nFS_CMK_POLICY=$(cat <<EOF\n{\n \"Version\":\"2012-10-17\",\n \"Statement\":[\n {\"Sid\":\"Root\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::${ACCOUNT}:root\"},\"Action\":\"kms:*\",\"Resource\":\"*\"},\n {\"Sid\":\"EFSService\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"elasticfilesystem.amazonaws.com\"},\"Action\":[\"kms:Encrypt\",\"kms:Decrypt\",\"kms:ReEncrypt*\",\"kms:GenerateDataKey*\",\"kms:DescribeKey\",\"kms:CreateGrant\"],\"Resource\":\"*\"}\n ]\n}\nEOF\n)\nFS_CMK_ARN=$($AWS kms create-key --description \"EFS harbor-shared-fs CMK\" \\\n --key-usage ENCRYPT_DECRYPT --key-spec SYMMETRIC_DEFAULT \\\n --policy \"$FS_CMK_POLICY\" \\\n --query 'KeyMetadata.Arn' --output text)\nFS_CMK_ID=$(echo \"$FS_CMK_ARN\" | awk -F'/' '{print $NF}')\n$AWS kms create-alias --alias-name alias/harbor-efs-cmk --target-key-id \"$FS_CMK_ID\"\necho \"FS_CMK_ARN=$FS_CMK_ARN\"\n\nBACKUP_CMK_POLICY=$(cat <<EOF\n{\n \"Version\":\"2012-10-17\",\n \"Statement\":[\n {\"Sid\":\"Root\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::${ACCOUNT}:root\"},\"Action\":\"kms:*\",\"Resource\":\"*\"},\n {\"Sid\":\"BackupService\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"backup.amazonaws.com\"},\"Action\":[\"kms:Encrypt\",\"kms:Decrypt\",\"kms:ReEncrypt*\",\"kms:GenerateDataKey*\",\"kms:DescribeKey\",\"kms:CreateGrant\"],\"Resource\":\"*\"}\n ]\n}\nEOF\n)\nBACKUP_CMK_ARN=$($AWS kms create-key --description \"AWS Backup vault CMK\" \\\n --key-usage ENCRYPT_DECRYPT --key-spec SYMMETRIC_DEFAULT \\\n --policy \"$BACKUP_CMK_POLICY\" \\\n --query 'KeyMetadata.Arn' --out
…[truncated]File created successfully at: /app/build.sh (file state is current in your context , no need to Read it back) …[truncated]
{
"command": "chmod +x /app/build.sh && /app/build.sh 2>&1 | tail -120",
"description": "Run build script"
}=== VPC === VPC_ID=vpc-b1076f00dbf408b8c SUBNETS: subnet-b92911162c0d3ba9c subnet-5eaa7354a0fba9b54 === Security groups === SG_APP=sg-682eaf03e21d38bbc SG_LAMBDA=sg-0990787448701b23a SG_EFS=sg-b3fae07570ed8b31f === KMS CMKs === FS_CMK_ARN=arn:aws:kms:us-east-1:000000000000:key/be3794f8-44ca-4a09-8487-870b0997e6d8 BACKUP_CMK_ARN=arn:aws:kms:us-east-1:000000000000:key/440e53d3-9d07-4cd2-8d08-98509496a586 === IAM roles === APP_ROLE_ARN=arn:aws:iam::000000000000:role/harbor-efs-app-role LAMBDA_ROLE_ARN=arn:aws:iam::000000000000:role/harbor-efs-lambda-role BACKUP_ROLE_ARN=arn:aws:iam::000000000000:role/harbor-efs-backup-role === EFS file system === FS_ID=fs-c62487c3 MTs: fsmt-6ba2cb21 fsmt-26cb20d8 lifecycle set === Access point === AP_ID=fsap-4c7afc78 === FS policy === === IAM client policies === === Lambda === LAMBDA_ARN=arn:aws:lambda:us-east-1:000000000000:function:harbor-efs-processor === Backup vault + plan === PLAN_ID=1b5c1c02-c66c-458d-afbe-dd7c6c402818 === EFS replication === aws: [ERROR]: An error occurred (InternalFailure) when calling the CreateReplicationConfiguration operation: No moto route for service efs on path /2015-02-01/file-systems/fs-c62487c3/replication-configuration found. (replication: shape only , endpoint may stub) === Alarms === === SSM manifest === === DONE === [stdout] === VPC === VPC_ID=vpc-b1076f00dbf408b8c SUBNETS: subnet-b92911162c0d3ba9c subnet-5eaa7354a0fba9b54 === Security groups === SG_APP=sg-682eaf03e21d38bbc SG_LAMBDA=sg-0990787448701b23a SG_EFS=sg-b3fae07570ed8b31f === KMS CMKs === FS_CMK_ARN=arn:aws:kms:us-east-1:000000000000:key/be3794f8-44ca-4a09-8487-870b0997e6d8 BACKUP_CMK_ARN=arn:aws:kms:us-east-1:000000000000:key/440e53d3-9d07-4cd2-8d08-98509496a586 === IAM roles === APP_ROLE_ARN=arn:aws:iam::000000000000:role/harbor-efs-app-role LAMBDA_ROLE_ARN=arn:aws:iam::000000000000:role/harbor-efs-lambda-role BACKUP_ROLE_ARN=arn:aws:iam::000000000000:role/harbor-efs-backup-role === EFS file system === FS_ID=fs-c62487c3 MTs: fsmt-6ba2cb21 fsmt-26cb20d8 lifecycle set === Access point === AP_ID=fsap-4c7afc78 === FS policy === === IAM client policies === === Lambda === LAMBDA_ARN=arn:aws:lambda:us-east-1:000000000000:function:harbor-efs-processor === Backup vault + plan === PLAN_ID=1b5c1c02-c66c-458d-afbe-dd7c6c402818 === EFS replication === aws: [ERROR]: An error occurred (InternalFailure) when calling the CreateReplicationConfiguration operation: No moto route for service efs on path /2015-02-01/file-systems/fs-c62487c3/replication-configuration found. (replication: shape only , endpoint may stub) === Alarms === === SSM manifest === === DONE ===
{
"command": "curl -s -X POST \"${AWS_ENDPOINT_URL}/2015-02-01/file-systems/$(aws --endpoint-url=$AWS_ENDPOINT_URL ssm get-parameter --name /harbor/efs/fs-id --query Parameter.Value --output text)/replication-configuration\" \\\n -H 'Content-Type: application/json' \\\n -d '{\"Destinations\":[{\"Region\":\"us-west-2\"}]}' 2>&1 | head -20",
"description": "Try direct REST call"
}(Bash completed with no output)
{
"command": "FS_ID=$(aws --endpoint-url=$AWS_ENDPOINT_URL ssm get-parameter --name /harbor/efs/fs-id --query Parameter.Value --output text)\necho \"FS_ID=$FS_ID\"\ncurl -sv -X POST \"${AWS_ENDPOINT_URL}/2015-02-01/file-systems/${FS_ID}/replication-configuration\" \\\n -H 'Content-Type: application/json' \\\n -H 'Authorization: AWS4-HMAC-SHA256 Credential=test/20260508/us-east-1/elasticfilesystem/aws4_request' \\\n -d '{\"Destinations\":[{\"Region\":\"us-west-2\"}]}' 2>&1 | tail -30",
"description": "Try direct REST with auth header"
}FS_ID=fs-c62487c3
* Host localstack:4566 was resolved.
* IPv6: (none)
* IPv4: 172.18.0.2
* Trying 172.18.0.2:4566...
* Connected to localstack (172.18.0.2) port 4566
> POST /2015-02-01/file-systems/fs-c62487c3/replication-configuration HTTP/1.1
> Host: localstack:4566
> User-Agent: curl/8.5.0
> Accept: */*
> Content-Type: application/json
> Authorization: AWS4-HMAC-SHA256 Credential=test/20260508/us-east-1/elasticfilesystem/aws4_request
> Content-Length: 41
>
} [41 bytes data]
< HTTP/1.1 501 NOT IMPLEMENTED
< Server: TwistedWeb/25.5.0
< Date: Fri, 08 May 2026 21:42:12 GMT
< Content-Type: application/json
< X-Amzn-Errortype: InternalFailure
< Content-Length: 151
< x-amzn-RequestId: 8e75f520-f6f2-4711-943e-3bd5d5d87cac
< x-amz-request-id: 8e75f520-f6f2-4711-943e-3bd5d5d87cac
< x-localstack: true
<
{ [151 bytes data]
* Connection #0 to host localstack left intact
{"__type": "InternalFailure", "message": "No moto route for service efs on path /2015-02-01/file-systems/fs-c62487c3/replication-configuration found."}
[stdout]
FS_ID=fs-c62487c3
* Host localstack:4566 was resolved.
* IPv6: (none)
* IPv4: 172.18.0.2
* Trying 172.18.0.2:4566...
* Connected to localstack (172.18.0.2) port 4566
> POST /2015-02-01/file-systems/fs-c62487c3/replication-configuration HTTP/1.1
> Host: localstack:4566
> User-Agent: curl/8.5.0
> Accept: */*
> Content-Type: application/json
> Authorization: AWS4-HMAC-SHA256 Credential=test/20260508/us-east-1/elasticfilesystem/aws4_request
> Content-Length: 41
>
} [41 bytes data]
< HTTP/1.1 501 NOT IMPLEMENTED
< Server: TwistedWeb/25.5.0
< Date: Fri, 08 May 2026 21:42:12 GMT
< Content-Type: application/json
< X-Amzn-Errortype: InternalFailure
< Content-Length: 151
< x-amzn-RequestId: 8e75f520-f6f2-4711-943e-3bd5d5d87cac
< x-amz-request-id: 8e75f520-f6f2-4711-943e-3bd5d5d87cac
< x-localstack: true
<
{ [151 bytes data]
* Connection #0 to host localstack left intact
{"__type": "InternalFailure", "message": "No moto route for service efs on path /2015-02-01/file-systems/fs-c62487c3/replication-configuration found."}{
"command": "aws --endpoint-url=$AWS_ENDPOINT_URL ssm get-parameters-by-path --path /harbor/efs --query 'Parameters[].[Name,Value]' --output table 2>&1",
"description": "List SSM manifest"
}------------------------------------------------------------------------------------------------------------------ | GetParametersByPath | +--------------------------------+-------------------------------------------------------------------------------+ | /harbor/efs/fs-id | fs-c62487c3 | | /harbor/efs/access-point-id | fsap-4c7afc78 | | /harbor/efs/cmk-arn | arn:aws:kms:us-east-1:000000000000:key/be3794f8-44ca-4a09-8487-870b0997e6d8 | | /harbor/efs/backup-cmk-arn | arn:aws:kms:us-east-1:000000000000:key/440e53d3-9d07-4cd2-8d08-98509496a586 | | /harbor/efs/app-role-arn | arn:aws:iam::000000000000:role/harbor-efs-app-role | | /harbor/efs/lambda-role-arn | arn:aws:iam::000000000000:role/harbor-efs-lambda-role | | /harbor/efs/lambda-arn | arn:aws:lambda:us-east-1:000000000000:function:harbor-efs-processor | | /harbor/efs/lambda-sg-id | sg-0990787448701b23a | | /harbor/efs/app-sg-id | sg-682eaf03e21d38bbc | | /harbor/efs/mount-sg-id | sg-b3fae07570ed8b31f | | /harbor/efs/vpc-id | vpc-b1076f00dbf408b8c | | /harbor/efs/backup-vault-name | harbor-efs-backup-vault | | /harbor/efs/backup-plan-id | 1b5c1c02-c66c-458d-afbe-dd7c6c402818 | | /harbor/efs/backup-role-arn | arn:aws:iam::000000000000:role/harbor-efs-backup-role | +--------------------------------+-------------------------------------------------------------------------------+ [stdout] ------------------------------------------------------------------------------------------------------------------ | GetParametersByPath | +--------------------------------+-------------------------------------------------------------------------------+ | /harbor/efs/fs-id | fs-c62487c3 | | /harbor/efs/access-point-id | fsap-4c7afc78 | | /harbor/efs/cmk-arn | arn:aws:kms:us-east-1:000000000000:key/be3794f8-44ca-4a09-8487-870b0997e6d8 | | /harbor/efs/backup-cmk-arn | arn:aws:kms:us-east-1:000000000000:key/440e53d3-9d07-4cd2-8d08-98509496a586 | | /harbor/efs/app-role-arn | arn:aws:iam::000000000000:role/harbor-efs-app-role | | /harbor/efs/lambda-role-arn | arn:aws:iam::000000000000:role/harbor-efs-lambda-role | | /harbor/efs/lambda-arn | arn:aws:lambda:us-east-1:000000000000:function:harbor-efs-processor | | /harbor/efs/lambda-sg-id | sg-0990787448701b23a | | /harbor/efs/app-sg-id | sg-682eaf03e21d38bbc | | /harbor/efs/mount-sg-id | sg-b3fae07570ed8b31f | | /harbor/efs/vpc-id | vpc-b1076f00dbf408b8c | | /harbor/efs/backup-vault-name | harbor-efs-backup-vault | | /harbor/efs/backup-plan-id | 1b5c1c02-c66c-458d-afbe-dd7c6c402818 | | /harbor/efs/backup-role-arn | arn:aws:iam::000000000000:role/harbor-efs-ba …[truncated]
{
"command": "A=\"aws --endpoint-url=$AWS_ENDPOINT_URL\"\necho \"--- EFS FS ---\"\n$A efs describe-file-systems --query 'FileSystems[0].{ID:FileSystemId,Encrypted:Encrypted,KMS:KmsKeyId,Perf:PerformanceMode,Throughput:ThroughputMode,Tags:Tags}' 2>&1\necho \"--- AP ---\"\n$A efs describe-access-points --query 'AccessPoints[0].{ID:AccessPointId,FS:FileSystemId,Posix:PosixUser,Root:RootDirectory,Tags:Tags}' 2>&1\necho \"--- Lifecycle ---\"\n$A efs describe-lifecycle-configuration --file-system-id fs-c62487c3 2>&1\necho \"--- FS policy ---\"\n$A efs describe-file-system-policy --file-system-id fs-c62487c3 --query 'Policy' --output text 2>&1 | head -100\necho \"--- Mount targets ---\"\n$A efs describe-mount-targets --file-system-id fs-c62487c3 --query 'MountTargets[].{ID:MountTargetId,AZ:AvailabilityZoneName,Subnet:SubnetId}' 2>&1",
"description": "Verify EFS state"
}--- EFS FS ---
{
"ID": "fs-c62487c3",
"Encrypted": true,
"KMS": "arn:aws:kms:us-east-1:000000000000:key/be3794f8-44ca-4a09-8487-870b0997e6d8",
"Perf": "generalPurpose",
"Throughput": "elastic",
"Tags": [
{
"Key": "Name",
"Value": "harbor-shared-fs"
},
{
"Key": "Backup",
"Value": "true"
}
]
}
--- AP ---
{
"ID": "fsap-4c7afc78",
"FS": "fs-c62487c3",
"Posix": {
"Uid": 1500,
"Gid": 1500
},
"Root": {
"Path": "/ci-runner",
"CreationInfo": {
"OwnerUid": 1500,
"OwnerGid": 1500,
"Permissions": "0755"
}
},
"Tags": [
{
"Key": "Name",
"Value": "harbor-ci-runner-ap"
}
]
}
--- Lifecycle ---
{
"LifecyclePolicies": [
{
"TransitionToIA": "AFTER_30_DAYS"
},
{
"TransitionToArchive": "AFTER_90_DAYS"
},
{
"TransitionToPrimaryStorageClass": "AFTER_1_ACCESS"
}
]
}
--- FS policy ---
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"DenyNonTLS",
"Effect":"Deny",
"NotPrincipal":{"Service":"elasticfilesystem.amazonaws.com"},
"Action":["elasticfilesystem:Client*"],
"Resource":"arn:aws:elasticfilesystem:us-east-1:000000000000:file-system/fs-c62487c3",
"Condition":{"Bool":{"aws:SecureTransport":"false"}}
},
{
"Sid":"AllowAppRoleViaAP",
"Effect":"Allow",
"Principal":{"AWS":"arn:aws:iam::000000000000:role/harbor-efs-app-role"},
"Action":["elasticfilesystem:ClientMount","elasticfilesystem:ClientWrite","elasticfilesystem:ClientRootAccess"],
"Resource":"arn:aws:elasticfilesystem:us-east-1:000000000000:file-system/fs-c62487c3",
"Condition":{"StringEquals":{"elasticfilesystem:AccessPointArn":"arn:aws:elasticfilesystem:us-east-1:000000000000:access-point/fsap-4c7afc78"}}
},
{
"Sid":"AllowLambdaRoleViaAP",
"Effect":"Allow",
"Principal":{"AWS":"arn:aws:iam::000000000000:role/harbor-efs-lambda-role"},
"Action":["elasticfilesystem:ClientMount","elasticfilesystem:ClientWrite","elasticfilesystem:ClientRootAccess"],
"Resource":"arn:aws:elasticfilesystem:us-east-1:000000000000:file-system/fs-c62487c3",
"Condition":{"StringEquals":{"elasticfilesystem:AccessPointArn":"arn:aws:elasticfilesystem:us-east-1:000000000000:access-point/fsap-4c7afc78"}}
}
]
}
--- Mount targets ---
[
{
"ID": "fsmt-6ba2cb21",
"AZ": "us-east-1a",
"Subnet": "subnet-b92911162c0d3ba9c"
},
{
"ID": "fsmt-26cb20d8",
"AZ": "us-east-1b",
"Subnet": "subnet-5eaa7354a0fba9b54"
}
]
[stdout]
--- EFS FS ---
{
"ID": "fs-c62487c3",
"Encrypted": true,
"KMS": "arn:aws:kms:us-east-1:000000000000:key/be3794f8-44ca-4a09-8487-870b0997e6d8",
"Perf": "generalPurpose",
"Throughput": "elastic",
"Tags": [
{
"Key": "Name",
"Value": "harbor-shared-fs"
},
{
"Key": "Backup",
"Value": "true"
}
]
}
--- AP ---
{
"ID": "fsap-4c7afc78",
"FS": "fs-c62487c3",
"Posix": {
"Uid": 1500,
"Gid": 1500
},
"Root": {
"Path": "/ci-runner",
"CreationInfo": {
"OwnerUid": 1500,
"OwnerGid": 1500,
"Permissions": "0755"
}
},
"Tags": [
{
"Key": "Name",
"Value": "harbor-ci-runner-ap"
}
]
}
--- Lifecycle ---
{
"LifecyclePolicies": [
{
"TransitionToIA": "AFTER_30_DAYS"
},
{
"TransitionToArchive": "AFTER_90_DAYS"
},
{
"TransitionToPrimaryStorageClass": "AFTER_1_ACCESS"
}
]
}
--- FS policy ---
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"DenyNonTLS",
"Effec
…[truncated]{
"command": "A=\"aws --endpoint-url=$AWS_ENDPOINT_URL\"\necho \"--- Lambda ---\"\n$A lambda get-function --function-name harbor-efs-processor --query 'Configuration.{Name:FunctionName,Runtime:Runtime,Role:Role,VpcConfig:VpcConfig,FS:FileSystemConfigs}' 2>&1\necho \"--- Backup vault ---\"\n$A backup describe-backup-vault --backup-vault-name harbor-efs-backup-vault 2>&1\necho \"--- Backup plan ---\"\n$A backup get-backup-plan --backup-plan-id 1b5c1c02-c66c-458d-afbe-dd7c6c402818 2>&1\necho \"--- Backup selection ---\"\n$A backup list-backup-selections --backup-plan-id 1b5c1c02-c66c-458d-afbe-dd7c6c402818 2>&1\necho \"--- Alarms ---\"\n$A cloudwatch describe-alarms --alarm-names harbor-efs-burst-credits harbor-efs-client-connections harbor-efs-percent-io --query 'MetricAlarms[].{Name:AlarmName,Metric:MetricName,Stat:Statistic,Threshold:Threshold,Op:ComparisonOperator,Missing:TreatMissingData}' 2>&1",
"description": "Verify Lambda/Backup/Alarms"
}--- Lambda ---
{
"Name": "harbor-efs-processor",
"Runtime": "python3.11",
"Role": "arn:aws:iam::000000000000:role/harbor-efs-lambda-role",
"VpcConfig": {
"SubnetIds": [
"subnet-b92911162c0d3ba9c",
"subnet-5eaa7354a0fba9b54"
],
"SecurityGroupIds": [
"sg-0990787448701b23a"
],
"VpcId": "vpc-b1076f00dbf408b8c"
},
"FS": null
}
--- Backup vault ---
{
"BackupVaultName": "harbor-efs-backup-vault",
"BackupVaultArn": "arn:aws:backup:us-east-1:000000000000:backup-vault:harbor-efs-backup-vault",
"VaultType": "BACKUP_VAULT",
"CreationDate": "2026-05-08T21:41:49.170429+00:00",
"NumberOfRecoveryPoints": 0,
"Locked": false
}
--- Backup plan ---
{
"BackupPlan": {
"BackupPlanName": "harbor-efs-daily",
"Rules": [
{
"RuleName": "daily",
"TargetBackupVaultName": "harbor-efs-backup-vault",
"ScheduleExpression": "cron(0 5 ? * * *)",
"StartWindowMinutes": 60,
"CompletionWindowMinutes": 180,
"Lifecycle": {
"MoveToColdStorageAfterDays": 30,
"DeleteAfterDays": 365
}
}
]
},
"BackupPlanId": "1b5c1c02-c66c-458d-afbe-dd7c6c402818",
"BackupPlanArn": "arn:aws:backup:us-east-1:000000000000:backup-plan:1b5c1c02-c66c-458d-afbe-dd7c6c402818",
"VersionId": "326897c7",
"CreationDate": "2026-05-08T21:41:49.605608+00:00"
}
--- Backup selection ---
{
"BackupSelectionsList": [
{
"SelectionId": "5169878f-4b4f-473b-b581-ff2b9aaaab36",
"SelectionName": "harbor-efs-tag-selection",
"BackupPlanId": "1b5c1c02-c66c-458d-afbe-dd7c6c402818",
"CreationDate": "2026-05-08T21:41:50.463040+00:00",
"IamRoleArn": "arn:aws:iam::000000000000:role/harbor-efs-backup-role"
}
]
}
--- Alarms ---
[
{
"Name": "harbor-efs-burst-credits",
"Metric": "BurstCreditBalance",
"Stat": "Average",
"Threshold": 1099511627776.0,
"Op": "LessThanThreshold",
"Missing": null
},
{
"Name": "harbor-efs-client-connections",
"Metric": "ClientConnections",
"Stat": "Sum",
"Threshold": 0.0,
"Op": "LessThanOrEqualToThreshold",
"Missing": "breaching"
},
{
"Name": "harbor-efs-percent-io",
"Metric": "PercentIOLimit",
"Stat": "Maximum",
"Threshold": 80.0,
"Op": "GreaterThanThreshold",
"Missing": null
}
]
[stdout]
--- Lambda ---
{
"Name": "harbor-efs-processor",
"Runtime": "python3.11",
"Role": "arn:aws:iam::000000000000:role/harbor-efs-lambda-role",
"VpcConfig": {
"SubnetIds": [
"subnet-b92911162c0d3ba9c",
"subnet-5eaa7354a0fba9b54"
],
"SecurityGroupIds": [
"sg-0990787448701b23a"
],
"VpcId": "vpc-b1076f00dbf408b8c"
},
"FS": null
}
--- Backup vault ---
{
"BackupVaultName": "harbor-efs-backup-vault",
"BackupVaultArn": "arn:aws:backup:us-east-1:000000000000:backup-vault:harbor-efs-backup-vault",
"VaultType": "BACKUP_VAULT",
"CreationDate": "2026-05-08T21:41:49.170429+00:00",
"NumberOfRecoveryPoints": 0,
"Locked": false
}
--- Backup plan ---
{
"BackupPlan": {
"BackupPlanName": "harbor-efs-daily",
"Rules": [
{
"RuleName": "daily",
"TargetBackupVaultName": "harbor-efs-backup-vault",
"ScheduleExpression": "cron(0 5 ? * * *)",
"StartWindowMinutes": 60,
"CompletionWindowMinutes": 180,
"Lifecycle": {
"MoveToColdStorageAfterDays": 30,
"DeleteAfterDays": 365
}
}
]
},
"BackupPlanId": "1b5c1c02-c66c-458d-afbe-dd7c6c402
…[truncated]{
"command": "aws --endpoint-url=$AWS_ENDPOINT_URL lambda update-function-configuration \\\n --function-name harbor-efs-processor \\\n --file-system-configs \"Arn=arn:aws:elasticfilesystem:us-east-1:000000000000:access-point/fsap-4c7afc78,LocalMountPath=/mnt/data\" 2>&1 | head -30",
"description": "Set FileSystemConfigs via update"
}{
"FunctionName": "harbor-efs-processor",
"FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:harbor-efs-processor",
"Runtime": "python3.11",
"Role": "arn:aws:iam::000000000000:role/harbor-efs-lambda-role",
"Handler": "lambda_function.handler",
"CodeSize": 239,
"Description": "",
"Timeout": 3,
"MemorySize": 128,
"LastModified": "2026-05-08T21:42:47.306975+0000",
"CodeSha256": "e4Ft8cHrXi+OCovfX55bjMHLghe940QNrM+DTVS+ySg=",
"Version": "$LATEST",
"VpcConfig": {
"SubnetIds": [
"subnet-b92911162c0d3ba9c",
"subnet-5eaa7354a0fba9b54"
],
"SecurityGroupIds": [
"sg-0990787448701b23a"
],
"VpcId": "vpc-b1076f00dbf408b8c"
},
"TracingConfig": {
"Mode": "PassThrough"
},
"RevisionId": "765329c0-cb10-4004-a616-cb7b4415bf57",
"State": "Active",
"LastUpdateStatus": "InProgress",
"LastUpdateStatusReason": "The function is being created.",
[stdout]
{
"FunctionName": "harbor-efs-processor",
"FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:harbor-efs-processor",
"Runtime": "python3.11",
"Role": "arn:aws:iam::000000000000:role/harbor-efs-lambda-role",
"Handler": "lambda_function.handler",
"CodeSize": 239,
"Description": "",
"Timeout": 3,
"MemorySize": 128,
"LastModified": "2026-05-08T21:42:47.306975+0000",
"CodeSha256": "e4Ft8cHrXi+OCovfX55bjMHLghe940QNrM+DTVS+ySg=",
"Version": "$LATEST",
"VpcConfig": {
"SubnetIds": [
"subnet-b92911162c0d3ba9c",
"subnet-5eaa7354a0fba9b54"
],
"SecurityGroupIds": [
"sg-0990787448701b23a"
],
"VpcId": "vpc-b1076f00dbf408b8c"
},
"TracingConfig": {
"Mode": "PassThrough"
},
"RevisionId": "765329c0-cb10-4004-a616-cb7b4415bf57",
"State": "Active",
"LastUpdateStatus": "InProgress",
"LastUpdateStatusReason": "The function is being created.",{
"command": "aws --endpoint-url=$AWS_ENDPOINT_URL lambda get-function-configuration --function-name harbor-efs-processor --query 'FileSystemConfigs' 2>&1",
"description": "Confirm FS config persisted"
}null [stdout] null
{
"command": "sleep 3\naws --endpoint-url=$AWS_ENDPOINT_URL lambda get-function-configuration --function-name harbor-efs-processor 2>&1 | grep -A5 -i \"FileSystem\\|LastUpdate\\|State\"",
"description": "Re-check after wait"
}"State": "Active",
"LastUpdateStatus": "Successful",
"PackageType": "Zip",
"Architectures": [
"x86_64"
],
"EphemeralStorage": {
[stdout]
"State": "Active",
"LastUpdateStatus": "Successful",
"PackageType": "Zip",
"Architectures": [
"x86_64"
],
"EphemeralStorage": {{
"command": "aws --endpoint-url=$AWS_ENDPOINT_URL lambda get-function --function-name harbor-efs-processor --query 'Configuration.FileSystemConfigs' 2>&1",
"description": "Re-check FS configs"
}null [stdout] null
{
"command": "curl -s \"${AWS_ENDPOINT_URL}/_localstack/health\" 2>&1 | head -50",
"description": "Check LocalStack version"
}{"features": {"persistence": "disabled"}, "services": {"acm": "disabled", "apigateway": "disabled", "cloudformation": "disabled", "cloudwatch": "running", "config": "disabled", "dynamodb": "disabled", "dynamodbstreams": "disabled", "ec2": "running", "es": "disabled", "events": "disabled", "firehose": "disabled", "iam": "running", "kinesis": "disabled", "kms": "running", "lambda": "running", "logs": "available", "opensearch": "disabled", "redshift": "disabled", "resource-groups": "disabled", "resourcegroupstaggingapi": "disabled", "route53": "disabled", "route53resolver": "disabled", "s3": "running", "s3control": "disabled", "scheduler": "disabled", "secretsmanager": "available", "ses": "disabled", "sns": "disabled", "sqs": "disabled", "ssm": "running", "stepfunctions": "disabled", "sts": "running", "support": "disabled", "swf": "disabled", "transcribe": "disabled", "account": "disabled", "acm-pca": "disabled", "amplify": "disabled", "apigatewaymanagementapi": "disabled", "apigatewayv2": "disabled", "appconfig": "disabled", "appconfigdata": "disabled", "application-autoscaling": "disabled", "appsync": "disabled", "athena": "disabled", "autoscaling": "disabled", "backup": "running", "batch": "disabled", "bedrock-runtime": "disabled", "bedrock": "disabled", "ce": "disabled", "cloudcontrol": "disabled", "cloudfront": "disabled", "cloudtrail": "disabled", "codeartifact": "disabled", "codebuild": "disabled", "codecommit": "disabled", "codeconnections": "disabled", "codedeploy": "disabled", "codepipeline": "disabled", "codestar-connections": "disabled", "cognito-identity": "disabled", "cognito-idp": "disabled", "dms": "disabled", "docdb": "disabled", "ecr": "disabled", "ecs": "disabled", "efs": "running", "eks-auth": "disabled", "eks": "disabled", "elasticache": "disabled", "elasticbeanstalk": "disabled", "elb": "disabled", "elbv2": "disabled", "emr-serverless": "disabled", "emr": "disabled", "fis": "disabled", "glacier": "disabled", "glue": "disabled", "identitystore": "disabled", "iot-data": "disabled", "iot": "disabled", "iotwireless": "disabled", "kafka": "disabled", "kinesisanalyticsv2": "disabled", "lakeformation": "disabled", "managedblockchain": "disabled", "mediaconvert": "disabled", "memorydb": "disabled", "mq": "disabled", "mwaa": "disabled", "neptune": "disabled", "organizations": "disabled", "pinpoint": "disabled", "pipes": "disabled", "ram": "disabled", "rds-data": "disabled", "rds": "disabled", "redshift-data": "disabled", "s3tables": "disabled", "sagemaker-runtime": "disabled", "sagemaker": "disabled", "serverlessrepo": "disabled", "servicediscovery": "disabled", "sesv2": "disabled", "shield": "disabled", "sso-admin": "disabled", "textract": "disabled", "timestream-query": "disabled", "timestream-write": "disabled", "transfer": "disabled", "verifiedpermissions": "disabled", "wafv2": "disabled", "xray": "disabled"}, "edition": "pro", "version": "2026.3.0"}
[stdout]
{"features": {"persistence": "disabled"}, "services": {"acm": "disabled", "apigateway": "disabled", "cloudformation": "disabled", "cloudwatch": "running", "config": "disabled", "dynamodb": "disabled", "dynamodbstreams": "disabled", "ec2": "running", "es": "disabled", "events": "disabled", "firehose": "disabled", "iam": "running", "kinesis": "disabled", "kms": "running", "lambda": "running", "logs": "available", "opensearch": "disabled", "redshift": "disabled", "resource-groups": "disabled", "resourcegroupstaggingapi": "disabled", "route53": "disabled", "route53resolver": "disabled", "s3": "running", "s3control": "disabled", "scheduler": "disabled", "secretsmanager": "available", "ses": "disabled", "sns": "disabled", "sqs": "disabled", "ssm": "running", "stepfunctions": "disabled", "sts": "running", "support": "disabled", "swf": "disabled", "transcribe": "disabled", "account": "disabled", "acm-pca": "disabled", "amplify": "disabled", "apigatewaymanagementapi": "disabled", "apigatewayv2": "disabled", "appconfig": "disabled", "appconfigdata": "disabled", "appl
…[truncated]{
"command": "aws --endpoint-url=$AWS_ENDPOINT_URL lambda get-function-configuration --function-name harbor-efs-processor 2>&1",
"description": "Full Lambda config"
}{
"FunctionName": "harbor-efs-processor",
"FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:harbor-efs-processor",
"Runtime": "python3.11",
"Role": "arn:aws:iam::000000000000:role/harbor-efs-lambda-role",
"Handler": "lambda_function.handler",
"CodeSize": 239,
"Description": "",
"Timeout": 3,
"MemorySize": 128,
"LastModified": "2026-05-08T21:42:47.306975+0000",
"CodeSha256": "e4Ft8cHrXi+OCovfX55bjMHLghe940QNrM+DTVS+ySg=",
"Version": "$LATEST",
"VpcConfig": {
"SubnetIds": [
"subnet-b92911162c0d3ba9c",
"subnet-5eaa7354a0fba9b54"
],
"SecurityGroupIds": [
"sg-0990787448701b23a"
],
"VpcId": "vpc-b1076f00dbf408b8c"
},
"TracingConfig": {
"Mode": "PassThrough"
},
"RevisionId": "a41a0070-ae3d-4c07-ab47-e128302f516e",
"State": "Active",
"LastUpdateStatus": "Successful",
"PackageType": "Zip",
"Architectures": [
"x86_64"
],
"EphemeralStorage": {
"Size": 512
},
"SnapStart": {
"ApplyOn": "None",
"OptimizationStatus": "Off"
},
"RuntimeVersionConfig": {
"RuntimeVersionArn": "arn:aws:lambda:us-east-1::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1"
},
"LoggingConfig": {
"LogFormat": "Text",
"LogGroup": "/aws/lambda/harbor-efs-processor"
}
}
[stdout]
{
"FunctionName": "harbor-efs-processor",
"FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:harbor-efs-processor",
"Runtime": "python3.11",
"Role": "arn:aws:iam::000000000000:role/harbor-efs-lambda-role",
"Handler": "lambda_function.handler",
"CodeSize": 239,
"Description": "",
"Timeout": 3,
"MemorySize": 128,
"LastModified": "2026-05-08T21:42:47.306975+0000",
"CodeSha256": "e4Ft8cHrXi+OCovfX55bjMHLghe940QNrM+DTVS+ySg=",
"Version": "$LATEST",
"VpcConfig": {
"SubnetIds": [
"subnet-b92911162c0d3ba9c",
"subnet-5eaa7354a0fba9b54"
],
"SecurityGroupIds": [
"sg-0990787448701b23a"
],
"VpcId": "vpc-b1076f00dbf408b8c"
},
"TracingConfig": {
"Mode": "PassThrough"
},
"RevisionId": "a41a0070-ae3d-4c07-ab47-e128302f516e",
"State": "Active",
"LastUpdateStatus": "Successful",
"PackageType": "Zip",
"Architectures": [
"x86_64"
],
"EphemeralStorage": {
"Size": 512
},
"SnapStart": {
"ApplyOn": "None",
"OptimizationStatus": "Off"
},
"RuntimeVersionConfig": {
"RuntimeVersionArn": "arn:aws:lambda:us-east-1::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1"
},
"LoggingConfig": {
"LogFormat": "Text",
"LogGroup": "/aws/lambda/harbor-efs-processor"
}
}{
"command": "A=\"aws --endpoint-url=$AWS_ENDPOINT_URL\"\n$A lambda tag-resource \\\n --resource arn:aws:lambda:us-east-1:000000000000:function:harbor-efs-processor \\\n --tags \"EFSAccessPointArn=arn:aws:elasticfilesystem:us-east-1:000000000000:access-point/fsap-4c7afc78,EFSLocalMountPath=/mnt/data\" 2>&1\n$A ssm put-parameter --name /harbor/efs/lambda-mount-path --value \"/mnt/data\" --type String --overwrite >/dev/null\n$A ssm put-parameter --name /harbor/efs/access-point-arn --value \"arn:aws:elasticfilesystem:us-east-1:000000000000:access-point/fsap-4c7afc78\" --type String --overwrite >/dev/null\necho OK",
"description": "Tag Lambda + add SSM hints"
}OK [stdout] OK
{
"command": "A=\"aws --endpoint-url=$AWS_ENDPOINT_URL\"\necho \"--- KMS aliases ---\"\n$A kms list-aliases --query 'Aliases[?starts_with(AliasName,`alias/harbor`)]' 2>&1\necho \"--- IAM roles ---\"\nfor r in harbor-efs-app-role harbor-efs-lambda-role harbor-efs-backup-role; do\n echo \">>> $r\"\n $A iam list-attached-role-policies --role-name $r 2>&1\n $A iam list-role-policies --role-name $r 2>&1\ndone\necho \"--- SG ingress on sg-efs-mount ---\"\n$A ec2 describe-security-groups --group-ids sg-b3fae07570ed8b31f --query 'SecurityGroups[0].IpPermissions' 2>&1\necho \"--- VPC/Subnets ---\"\n$A ec2 describe-vpcs --vpc-ids vpc-b1076f00dbf408b8c --query 'Vpcs[0].{ID:VpcId,CIDR:CidrBlock,Tags:Tags}' 2>&1\n$A ec2 describe-subnets --filters Name=vpc-id,Values=vpc-b1076f00dbf408b8c --query 'Subnets[].{ID:SubnetId,AZ:AvailabilityZone,CIDR:CidrBlock}' 2>&1",
"description": "Verify KMS/IAM/VPC/SG"
}--- KMS aliases ---
[
{
"AliasName": "alias/harbor-efs-cmk",
"AliasArn": "arn:aws:kms:us-east-1:000000000000:alias/harbor-efs-cmk",
"TargetKeyId": "be3794f8-44ca-4a09-8487-870b0997e6d8",
"CreationDate": "2026-05-08T21:41:35.754617+00:00"
},
{
"AliasName": "alias/harbor-efs-backup-cmk",
"AliasArn": "arn:aws:kms:us-east-1:000000000000:alias/harbor-efs-backup-cmk",
"TargetKeyId": "440e53d3-9d07-4cd2-8d08-98509496a586",
"CreationDate": "2026-05-08T21:41:36.547184+00:00"
}
]
--- IAM roles ---
>>> harbor-efs-app-role
{
"AttachedPolicies": []
}
{
"PolicyNames": [
"efs-client-via-ap"
]
}
>>> harbor-efs-lambda-role
{
"AttachedPolicies": [
{
"PolicyName": "AWSLambdaVPCAccessExecutionRole",
"PolicyArn": "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
},
{
"PolicyName": "AWSLambdaBasicExecutionRole",
"PolicyArn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}
]
}
{
"PolicyNames": [
"efs-client-via-ap"
]
}
>>> harbor-efs-backup-role
{
"AttachedPolicies": []
}
{
"PolicyNames": [
"efs-backup"
]
}
--- SG ingress on sg-efs-mount ---
[
{
"IpProtocol": "tcp",
"FromPort": 2049,
"ToPort": 2049,
"UserIdGroupPairs": [
{
"UserId": "000000000000",
"GroupId": "sg-682eaf03e21d38bbc"
},
{
"UserId": "000000000000",
"GroupId": "sg-0990787448701b23a"
}
],
"IpRanges": [],
"Ipv6Ranges": [],
"PrefixListIds": []
}
]
--- VPC/Subnets ---
{
"ID": "vpc-b1076f00dbf408b8c",
"CIDR": "10.50.0.0/16",
"Tags": [
{
"Key": "Name",
"Value": "vpc-shared-fs"
}
]
}
[
{
"ID": "subnet-b92911162c0d3ba9c",
"AZ": "us-east-1a",
"CIDR": "10.50.1.0/24"
},
{
"ID": "subnet-5eaa7354a0fba9b54",
"AZ": "us-east-1b",
"CIDR": "10.50.2.0/24"
}
]
[stdout]
--- KMS aliases ---
[
{
"AliasName": "alias/harbor-efs-cmk",
"AliasArn": "arn:aws:kms:us-east-1:000000000000:alias/harbor-efs-cmk",
"TargetKeyId": "be3794f8-44ca-4a09-8487-870b0997e6d8",
"CreationDate": "2026-05-08T21:41:35.754617+00:00"
},
{
"AliasName": "alias/harbor-efs-backup-cmk",
"AliasArn": "arn:aws:kms:us-east-1:000000000000:alias/harbor-efs-backup-cmk",
"TargetKeyId": "440e53d3-9d07-4cd2-8d08-98509496a586",
"CreationDate": "2026-05-08T21:41:36.547184+00:00"
}
]
--- IAM roles ---
>>> harbor-efs-app-role
{
"AttachedPolicies": []
}
{
"PolicyNames": [
"efs-client-via-ap"
]
}
>>> harbor-efs-lambda-role
{
"AttachedPolicies": [
{
"PolicyName": "AWSLambdaVPCAccessExecutionRole",
"PolicyArn": "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
},
{
"PolicyName": "AWSLambdaBasicExecutionRole",
"PolicyArn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}
]
}
{
"PolicyNames": [
"efs-client-via-ap"
]
}
>>> harbor-efs-backup-role
{
"AttachedPolicies": []
}
{
"PolicyNames": [
"efs-backup"
]
}
--- SG ingress on sg-efs-mount ---
[
{
"IpProtocol": "tcp",
"FromPort": 2049,
"ToPort": 2049,
"UserIdGroupPairs": [
{
"UserId": "000000000000",
"GroupId": "sg-682eaf03e21d38bbc"
},
{
"UserId": "000000000000",
"GroupId": "sg-0990787448701b23a"
}
],
"IpRanges": [],
"Ipv6Ranges": [],
"PrefixListIds": []
}
]
--- VPC/Subnets ---
{
"ID": "vpc-b1076f00dbf408b8c",
…[truncated]No file changes, the agent left the workspace untouched.
downloading uv 0.9.7 aarch64-unknown-linux-gnu
Downloading botocore (12.7MiB)
Downloading pygments (1.2MiB)
Downloading pygments
Downloading botocore
Installed 13 packages in 61ms
============================= test session starts ==============================
platform linux -- Python 3.12.3, pytest-8.4.1, pluggy-1.6.0 -- /root/.cache/uv/archive-v0/pdUIk7LIhHpkUFpRYqE-N/bin/python
cachedir: .pytest_cache
rootdir: /tests
plugins: json-ctrf-0.3.5
collecting ... collected 36 items
../tests/test_outputs.py::test_01_vpc_and_subnets_exist PASSED [ 2%]
../tests/test_outputs.py::test_02_efs_filesystem_exists PASSED [ 5%]
../tests/test_outputs.py::test_03_two_mount_targets_available PASSED [ 8%]
../tests/test_outputs.py::test_04_access_point_exists PASSED [ 11%]
../tests/test_outputs.py::test_05_three_iam_roles_exist PASSED [ 13%]
../tests/test_outputs.py::test_06_three_security_groups_exist PASSED [ 16%]
../tests/test_outputs.py::test_07_lambda_function_exists PASSED [ 19%]
../tests/test_outputs.py::test_08_backup_vault_plan_selection_exist PASSED [ 22%]
../tests/test_outputs.py::test_09_ssm_pointers_resolve PASSED [ 25%]
../tests/test_outputs.py::test_10_fs_encrypted_with_cmk PASSED [ 27%]
../tests/test_outputs.py::test_11_fs_throughput_mode_elastic PASSED [ 30%]
../tests/test_outputs.py::test_12_ap_posix_user_set PASSED [ 33%]
../tests/test_outputs.py::test_13_ap_root_directory_creation_info PASSED [ 36%]
../tests/test_outputs.py::test_14_app_role_has_ap_scoped_perms PASSED [ 38%]
../tests/test_outputs.py::test_15_lambda_role_has_ap_scoped_perms PASSED [ 41%]
../tests/test_outputs.py::test_16_lambda_role_has_eni_perms FAILED [ 44%]
../tests/test_outputs.py::test_17_lambda_role_trusts_lambda_service PASSED [ 47%]
../tests/test_outputs.py::test_18_backup_role_trusts_backup_service PASSED [ 50%]
../tests/test_outputs.py::test_19_fs_policy_has_tls_deny_with_replication_exemption PASSED [ 52%]
../tests/test_outputs.py::test_20_fs_policy_has_per_role_ap_allow_statements PASSED [ 55%]
../tests/test_outputs.py::test_21_mount_sg_ingress_from_app_and_lambda PASSED [ 58%]
../tests/test_outputs.py::test_22_lambda_has_vpc_config PASSED [ 61%]
../tests/test_outputs.py::test_23_lambda_runtime_python PASSED [ 63%]
../tests/test_outputs.py::test_24_backup_plan_lifecycle_cold_le_delete_minus_90 PASSED [ 66%]
../tests/test_outputs.py::test_25_backup_selection_uses_tag_conditions PASSED [ 69%]
../tests/test_outputs.py::test_26_backup_role_grants_efs_backup PASSED [ 72%]
../tests/test_outputs.py::test_27_lifecycle_has_separate_transition_objects PASSED [ 75%]
../tests/test_outputs.py::test_28_burst_credits_alarm_average_lt PASSED [ 77%]
../tests/test_outputs.py::test_29_client_connections_alarm_sum_lte PASSED [ 80%]
../tests/test_outputs.py::test_30_percent_io_alarm_maximum_gt PASSED [ 83%]
../tests/test_outputs.py::test_31_alarms_dimensioned_by_filesystem_id PASSED [ 86%]
../tests/test_outputs.py::test_32_kms_fs_cmk_allows_efs_service PASSED [ 88%]
../tests/test_outputs.py::test_33_kms_backup_cmk_allows_backup_service PASSED [ 91%]
../tests/test_outputs.py::test_34_fs_tags_include_backup_true PASSED [ 94%]
../tests/test_outputs.py::test_35_app_role_resource_is_fs_arn_not_only_star PASSED [ 97%]
../tests/test_outputs.py::test_36_backup_vault_named_correctly PASSED [100%]
=================================== FAILURES ===================================
______________________ test_16_lambda_role_has_eni_perms _______________________
def test_16_lambda_role_has_eni_perms():
"""Lambda role grants ec2:CreateNetworkInterface (Hyperplane ENI for VPC config)."""
docs = _role_inline_doc(LAMBDA_ROLE)
actions = []
for d in docs:
for s in d.get("Statement", []):
a = s.get("Action")
actions.extend([a] if isinstance(a, str) else (a or []))
> assert "ec2:CreateNetworkInterface" in actions or "ec2:*" in actions, f"actions={actions}"
E AssertionError: actions=['elasticfilesystem:ClientMount', 'elasticfilesystem:ClientWrite']
E assert ('ec2:CreateNetworkInterface' in ['elasticfilesystem:ClientMount', 'elasticfilesystem:ClientWrite'] or 'ec2:*' in ['elasticfilesystem:ClientMount', 'elasticfilesystem:ClientWrite'])
/tests/test_outputs.py:259: AssertionError
=============================== warnings summary ===============================
test_outputs.py: 101 warnings
/root/.cache/uv/archive-v0/pdUIk7LIhHpkUFpRYqE-N/lib/python3.12/site-packages/botocore/auth.py:424: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
datetime_now = datetime.datetime.utcnow()
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
==================================== PASSES ====================================
=========================== short test summary info ============================
PASSED ../tests/test_outputs.py::test_01_vpc_and_subnets_exist
PASSED ../tests/test_outputs.py::test_02_efs_filesystem_exists
PASSED ../tests/test_outputs.py::test_03_two_mount_targets_available
PASSED ../tests/test_outputs.py::test_04_access_point_exists
PASSED ../tests/test_outputs.py::test_05_three_iam_roles_exist
PASSED ../tests/test_outputs.py::test_06_three_security_groups_exist
PASSED ../tests/test_outputs.py::test_07_lambda_function_exists
PASSED ../tests/test_outputs.py::test_08_backup_vault_plan_selection_exist
PASSED ../tests/test_outputs.py::test_09_ssm_pointers_resolve
PASSED ../tests/test_outputs.py::test_10_fs_encrypted_with_cmk
PASSED ../tests/test_outputs.py::test_11_fs_throughput_mode_elastic
PASSED ../tests/test_outputs.py::test_12_ap_posix_user_set
PASSED ../tests/test_outputs.py::test_13_ap_root_directory_creation_info
PASSED ../tests/test_outputs.py::test_14_app_role_has_ap_scoped_perms
PASSED ../tests/test_outputs.py::test_15_lambda_role_has_ap_scoped_perms
PASSED ../tests/test_outputs.py::test_17_lambda_role_trusts_lambda_service
PASSED ../tests/test_outputs.py::test_18_backup_role_trusts_backup_service
PASSED ../tests/test_outputs.py::test_19_fs_policy_has_tls_deny_with_replication_exemption
PASSED ../tests/test_outputs.py::test_20_fs_policy_has_per_role_ap_allow_statements
PASSED ../tests/test_outputs.py::test_21_mount_sg_ingress_from_app_and_lambda
PASSED ../tests/test_outputs.py::test_22_lambda_has_vpc_config
PASSED ../tests/test_outputs.py::test_23_lambda_runtime_python
PASSED ../tests/test_outputs.py::test_24_backup_plan_lifecycle_cold_le_delete_minus_90
PASSED ../tests/test_outputs.py::test_25_backup_selection_uses_tag_conditions
PASSED ../tests/test_outputs.py::test_26_backup_role_grants_efs_backup
PASSED ../tests/test_outputs.py::test_27_lifecycle_has_separate_transition_objects
PASSED ../tests/test_outputs.py::test_28_burst_credits_alarm_average_lt
PASSED ../tests/test_outputs.py::test_29_client_connections_alarm_sum_lte
PASSED ../tests/test_outputs.py::test_30_percent_io_alarm_maximum_gt
PASSED ../tests/test_outputs.py::test_31_alarms_dimensioned_by_filesystem_id
PASSED ../tests/test_outputs.py::test_32_kms_fs_cmk_allows_efs_service
PASSED ../tests/test_outputs.py::test_33_kms_backup_cmk_allows_backup_service
PASSED ../tests/test_outputs.py::test_34_fs_tags_include_backup_true
PASSED ../tests/test_outputs.py::test_35_app_role_resource_is_fs_arn_not_only_star
PASSED ../tests/test_outputs.py::test_36_backup_vault_named_correctly
FAILED ../tests/test_outputs.py::test_16_lambda_role_has_eni_perms - Assertio...
================== 1 failed, 35 passed, 101 warnings in 0.97s ==================Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_d217b4e8371a42ef. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_d217b4e8371a42ef · verifier authoritative; classifier explanatory.