CodeConnections
Service Prefixes
Two ARN prefixes coexist (service was rebranded from CodeStar Connections to CodeConnections):
| Prefix | ARN Format |
|---|---|
codeconnections |
arn:aws:codeconnections:REGION:ACCOUNT:connection/UUID |
codestar-connections |
arn:aws:codestar-connections:REGION:ACCOUNT:connection/UUID |
Both work in pipeline configurations. IAM policy prefix must match the resource ARN prefix.
Provider Comparison
| Feature | GitHub | GitHub Enterprise | GitLab.com | GitLab Self-Managed | Bitbucket Cloud | Azure DevOps |
|---|---|---|---|---|---|---|
| Host resource required | No | Yes | No | Yes | No | No |
| Auth mechanism | GitHub App | GitHub App | OAuth | OAuth | OAuth | OAuth |
| Org owner required | Yes | Yes | No | No | No | No |
| VPC endpoint needed | No | Yes (if private) | No | Yes | No | No |
| Provider type value | GitHub |
GitHubEnterpriseServer |
GitLab |
GitLabSelfManaged |
Bitbucket |
AzureDevOps |
Create a Connection
aws codeconnections create-connection \
--provider-type GitHub \
--connection-name my-github-connection \
--tags Key=managed_by,Value=aws-skills Key=skill,Value=deployFor self-managed providers, use --host-arn instead of --provider-type:
aws codeconnections create-connection \
--host-arn arn:aws:codeconnections:REGION:ACCOUNT:host/HOST_ID \
--connection-name my-gitlab-sm-connectionCheck status:
aws codeconnections get-connection --connection-arn CONNECTION_ARN \
--query "Connection.ConnectionStatus" --output textThe PENDING State Trap
Connections created via CLI/CloudFormation/CDK are always PENDING. There is NO API to complete authorization — the console OAuth handshake is mandatory.
A PENDING connection:
- Returns no errors from
create-connection - Passes ARN validation in pipeline definitions
- Silently fails when the pipeline fetches source
Authorize a Connection (Console Required)
GitHub / GitHub Enterprise
- AWS Console → Developer Tools > Settings > Connections
- Select PENDING connection → Update pending connection
- Install a new app (or select existing GitHub App)
- Browser redirects to GitHub — sign in as organization owner
- Select org, choose repos → Install
- Back in AWS Console → Connect
Pitfall: Non-owner members get cookie errors or blank pages. GitHub App installation REQUIRES org owner role.
GitLab.com / GitLab Self-Managed
- AWS Console → Developer Tools > Settings > Connections
- Select PENDING connection → Update pending connection
- Redirects to GitLab → authorize the AWS application
- Connect to finalize
Bitbucket Cloud
Same flow as GitLab: Console → select connection → redirect → authorize → Connect.
Verify
aws codeconnections get-connection --connection-arn CONNECTION_ARN \
--query "Connection.ConnectionStatus" --output text
# Expected: AVAILABLECreate a Host Resource (Self-Managed Only)
Required for GitHub Enterprise Server and GitLab Self-Managed. NOT needed for hosted providers.
aws codeconnections create-host \
--name my-gitlab-host \
--provider-type GitLabSelfManaged \
--provider-endpoint https://gitlab.internal.example.com \
--vpc-configuration VpcId=VPC_ID,SubnetIds=SUBNET_1,SUBNET_2,SecurityGroupIds=SG_ID,TlsCertificate=BASE64_PEM_CERT--vpc-configuration required when endpoint is not publicly accessible. TlsCertificate accepts PEM-encoded CA cert (base64).
Host creation is async — check status:
aws codeconnections get-host --host-arn HOST_ARN --query "Status" --output text
# Wait for: AVAILABLEConnection Sharing
A single connection serves unlimited pipelines within the same account and region. Create one connection per provider per account — do not create one per pipeline.
Cross-account: share connections using AWS Resource Access Manager (RAM). See sharing connections. Without RAM, each account needs its own connection.
IAM Configuration
Use codeconnections: prefix for all Actions. The dual prefix only matters in the Resource field (to match existing ARNs):
{
"Effect": "Allow",
"Action": [
"codeconnections:UseConnection"
],
"Resource": [
"arn:aws:codeconnections:REGION:ACCOUNT:connection/CONNECTION_UUID",
"arn:aws:codestar-connections:REGION:ACCOUNT:connection/OLD_CONNECTION_UUID"
],
"Condition": {
"StringEquals": {
"codeconnections:FullRepositoryId": "org/repo"
}
}
}CRITICAL: UseConnection is over-permissive without condition keys. It grants access to ALL repositories the connection can reach. MUST specify conditions:
| Condition Key | Purpose |
|---|---|
codeconnections:FullRepositoryId |
Restrict to specific repo (e.g., org/repo) |
codeconnections:ProviderAction |
Restrict operations (e.g., read only) |
codeconnections:BranchName |
Restrict to specific branch |
For pipeline service roles: minimum codeconnections:UseConnection with condition keys scoped to the repo.
For CodeBuild roles using CODEBUILD_CLONE_REF: add codeconnections:UseConnection to the CodeBuild service role (not the pipeline role), with the same condition key scoping.
Common Errors
| Error/Symptom | Cause | Fix |
|---|---|---|
| Pipeline fails "connection not available" | Connection PENDING | Complete OAuth in console |
| Blank page / cookie error during GitHub auth | User not org owner | Have org owner perform installation |
AccessDeniedException on UseConnection |
IAM only has one prefix | Add codeconnections:UseConnection and codestar-connections:UseConnection |
Host stuck in VPC_CONFIG_FAILED_INITIALIZATION |
VPC/subnet/SG misconfiguration | Verify route to provider endpoint, validate TLS cert |
| Pipeline trigger never fires | sourceActionName mismatch |
Ensure trigger sourceActionName matches action Name exactly |
| Repository not found | Wrong FullRepositoryId format | Use org/repo format (case-sensitive) |
Security
- MUST scope UseConnection with condition keys (FullRepositoryId, ProviderAction) — without them, any repo accessible to the connection is exposed
- Scope Resource to specific connection ARNs in production
- Enable CloudTrail for
codeconnections:*API auditing - Revoke connections when personnel with OAuth access leave the organization
- Connections store OAuth tokens managed by AWS — prefer connections over manual PATs which cannot be auto-rotated
Related
- codepipeline.md for source action and trigger configuration
- troubleshooting.md for pipeline-level debugging