← Files AWS CoreARCHIVED FILE
skills/aws-deployment/references/codeconnections.md
6.78 KB · Sep 30, 2026 · 22:47 UTC
# 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
```bash
aws codeconnections create-connection \
--provider-type GitHub \
--connection-name my-github-connection \
--tags Key=managed_by,Value=aws-skills Key=skill,Value=deploy
```
For self-managed providers, use `--host-arn` instead of `--provider-type`:
```bash
aws codeconnections create-connection \
--host-arn arn:aws:codeconnections:REGION:ACCOUNT:host/HOST_ID \
--connection-name my-gitlab-sm-connection
```
Check status:
```bash
aws codeconnections get-connection --connection-arn CONNECTION_ARN \
--query "Connection.ConnectionStatus" --output text
```
## The 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
1. AWS Console → **Developer Tools > Settings > Connections**
2. Select PENDING connection → **Update pending connection**
3. **Install a new app** (or select existing GitHub App)
4. Browser redirects to GitHub — sign in as **organization owner**
5. Select org, choose repos → **Install**
6. 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
1. AWS Console → **Developer Tools > Settings > Connections**
2. Select PENDING connection → **Update pending connection**
3. Redirects to GitLab → authorize the AWS application
4. **Connect** to finalize
### Bitbucket Cloud
Same flow as GitLab: Console → select connection → redirect → authorize → Connect.
### Verify
```bash
aws codeconnections get-connection --connection-arn CONNECTION_ARN \
--query "Connection.ConnectionStatus" --output text
# Expected: AVAILABLE
```
## Create a Host Resource (Self-Managed Only)
Required for GitHub Enterprise Server and GitLab Self-Managed. NOT needed for hosted providers.
```bash
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:
```bash
aws codeconnections get-host --host-arn HOST_ARN --query "Status" --output text
# Wait for: AVAILABLE
```
## Connection 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](https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-share.html). 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):
```json
{
"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](codepipeline.md) for source action and trigger configuration
- [troubleshooting.md](troubleshooting.md) for pipeline-level debugging
SHA-256: 2211436c42412c710b62f5b3bc9d58100104c8db485ec8065cde29dec690d623