@action-llama/action-llama 0.10.2 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +17 -6
- package/README.md +8 -4
- package/dist/agents/container-entry.d.ts.map +1 -1
- package/dist/agents/container-entry.js +37 -0
- package/dist/agents/container-entry.js.map +1 -1
- package/dist/agents/container-runner.d.ts +4 -0
- package/dist/agents/container-runner.d.ts.map +1 -1
- package/dist/agents/container-runner.js +82 -5
- package/dist/agents/container-runner.js.map +1 -1
- package/dist/agents/execution-engine.d.ts +2 -0
- package/dist/agents/execution-engine.d.ts.map +1 -1
- package/dist/agents/execution-engine.js +5 -1
- package/dist/agents/execution-engine.js.map +1 -1
- package/dist/agents/runner.d.ts +3 -0
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +45 -2
- package/dist/agents/runner.js.map +1 -1
- package/dist/cli/commands/chat.d.ts +5 -2
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +240 -23
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/cloud-deploy.d.ts.map +1 -1
- package/dist/cli/commands/cloud-deploy.js +5 -47
- package/dist/cli/commands/cloud-deploy.js.map +1 -1
- package/dist/cli/commands/cloud-setup.d.ts.map +1 -1
- package/dist/cli/commands/cloud-setup.js +20 -33
- package/dist/cli/commands/cloud-setup.js.map +1 -1
- package/dist/cli/commands/cloud-teardown.d.ts.map +1 -1
- package/dist/cli/commands/cloud-teardown.js +6 -126
- package/dist/cli/commands/cloud-teardown.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +0 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +19 -14
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/kill.d.ts +1 -1
- package/dist/cli/commands/kill.d.ts.map +1 -1
- package/dist/cli/commands/kill.js +17 -6
- package/dist/cli/commands/kill.js.map +1 -1
- package/dist/cli/commands/logs.d.ts.map +1 -1
- package/dist/cli/commands/logs.js +104 -58
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/pause.d.ts +1 -1
- package/dist/cli/commands/pause.d.ts.map +1 -1
- package/dist/cli/commands/pause.js +9 -6
- package/dist/cli/commands/pause.js.map +1 -1
- package/dist/cli/commands/resume.d.ts +1 -1
- package/dist/cli/commands/resume.d.ts.map +1 -1
- package/dist/cli/commands/resume.js +9 -6
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +12 -54
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +22 -39
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/gateway-client.d.ts +12 -0
- package/dist/cli/gateway-client.d.ts.map +1 -0
- package/dist/cli/gateway-client.js +27 -0
- package/dist/cli/gateway-client.js.map +1 -0
- package/dist/cli/main.js +49 -14
- package/dist/cli/main.js.map +1 -1
- package/dist/{shared/aws-constants.d.ts → cloud/aws/constants.d.ts} +3 -34
- package/dist/cloud/aws/constants.d.ts.map +1 -0
- package/dist/{shared/aws-constants.js → cloud/aws/constants.js} +3 -34
- package/dist/cloud/aws/constants.js.map +1 -0
- package/dist/cloud/{deploy-apprunner.d.ts → aws/deploy.d.ts} +6 -6
- package/dist/cloud/aws/deploy.d.ts.map +1 -0
- package/dist/cloud/{deploy-apprunner.js → aws/deploy.js} +2 -2
- package/dist/cloud/aws/deploy.js.map +1 -0
- package/dist/cloud/aws/iam.d.ts +37 -0
- package/dist/cloud/aws/iam.d.ts.map +1 -0
- package/dist/{cli/commands/cloud-iam.js → cloud/aws/iam.js} +30 -179
- package/dist/cloud/aws/iam.js.map +1 -0
- package/dist/cloud/aws/provider.d.ts +69 -0
- package/dist/cloud/aws/provider.d.ts.map +1 -0
- package/dist/cloud/aws/provider.js +173 -0
- package/dist/cloud/aws/provider.js.map +1 -0
- package/dist/cloud/aws/provision.d.ts +9 -0
- package/dist/cloud/aws/provision.d.ts.map +1 -0
- package/dist/{cli/commands/cloud-setup-ecs.js → cloud/aws/provision.js} +10 -9
- package/dist/cloud/aws/provision.js.map +1 -0
- package/dist/cloud/aws/teardown.d.ts +15 -0
- package/dist/cloud/aws/teardown.d.ts.map +1 -0
- package/dist/cloud/aws/teardown.js +74 -0
- package/dist/cloud/aws/teardown.js.map +1 -0
- package/dist/cloud/gcp/constants.d.ts +16 -0
- package/dist/cloud/gcp/constants.d.ts.map +1 -0
- package/dist/cloud/gcp/constants.js +16 -0
- package/dist/cloud/gcp/constants.js.map +1 -0
- package/dist/cloud/{deploy-cloudrun.d.ts → gcp/deploy.d.ts} +6 -6
- package/dist/cloud/gcp/deploy.d.ts.map +1 -0
- package/dist/cloud/{deploy-cloudrun.js → gcp/deploy.js} +7 -7
- package/dist/cloud/gcp/deploy.js.map +1 -0
- package/dist/cloud/gcp/iam.d.ts +20 -0
- package/dist/cloud/gcp/iam.d.ts.map +1 -0
- package/dist/cloud/gcp/iam.js +179 -0
- package/dist/cloud/gcp/iam.js.map +1 -0
- package/dist/cloud/gcp/provider.d.ts +28 -0
- package/dist/cloud/gcp/provider.d.ts.map +1 -0
- package/dist/cloud/gcp/provider.js +84 -0
- package/dist/cloud/gcp/provider.js.map +1 -0
- package/dist/cloud/gcp/provision.d.ts +14 -0
- package/dist/cloud/gcp/provision.d.ts.map +1 -0
- package/dist/cloud/gcp/provision.js +37 -0
- package/dist/cloud/gcp/provision.js.map +1 -0
- package/dist/cloud/gcp/teardown.d.ts +12 -0
- package/dist/cloud/gcp/teardown.d.ts.map +1 -0
- package/dist/cloud/gcp/teardown.js +67 -0
- package/dist/cloud/gcp/teardown.js.map +1 -0
- package/dist/cloud/image-builder.d.ts.map +1 -1
- package/dist/cloud/image-builder.js +115 -18
- package/dist/cloud/image-builder.js.map +1 -1
- package/dist/cloud/provider.d.ts +57 -0
- package/dist/cloud/provider.d.ts.map +1 -0
- package/dist/cloud/provider.js +21 -0
- package/dist/cloud/provider.js.map +1 -0
- package/dist/cloud/scheduler-image.d.ts.map +1 -1
- package/dist/cloud/scheduler-image.js +16 -3
- package/dist/cloud/scheduler-image.js.map +1 -1
- package/dist/cloud/state.d.ts +17 -0
- package/dist/cloud/state.d.ts.map +1 -0
- package/dist/cloud/state.js +48 -0
- package/dist/cloud/state.js.map +1 -0
- package/dist/docker/aws-shared.d.ts +6 -4
- package/dist/docker/aws-shared.d.ts.map +1 -1
- package/dist/docker/aws-shared.js +405 -23
- package/dist/docker/aws-shared.js.map +1 -1
- package/dist/docker/cloud-run-runtime.d.ts.map +1 -1
- package/dist/docker/cloud-run-runtime.js +10 -9
- package/dist/docker/cloud-run-runtime.js.map +1 -1
- package/dist/docker/ecs-runtime.d.ts +3 -1
- package/dist/docker/ecs-runtime.d.ts.map +1 -1
- package/dist/docker/ecs-runtime.js +78 -29
- package/dist/docker/ecs-runtime.js.map +1 -1
- package/dist/docker/image.d.ts +7 -0
- package/dist/docker/image.d.ts.map +1 -1
- package/dist/docker/image.js +31 -4
- package/dist/docker/image.js.map +1 -1
- package/dist/docker/lambda-runtime.js +1 -1
- package/dist/docker/lambda-runtime.js.map +1 -1
- package/dist/docker/local-runtime.js +4 -4
- package/dist/docker/local-runtime.js.map +1 -1
- package/dist/docker/network.d.ts.map +1 -1
- package/dist/docker/network.js +2 -2
- package/dist/docker/network.js.map +1 -1
- package/dist/docker/runtime.d.ts +23 -0
- package/dist/docker/runtime.d.ts.map +1 -1
- package/dist/gateway/api-key.d.ts +10 -0
- package/dist/gateway/api-key.d.ts.map +1 -0
- package/dist/gateway/api-key.js +19 -0
- package/dist/gateway/api-key.js.map +1 -0
- package/dist/gateway/auth.d.ts +16 -0
- package/dist/gateway/auth.d.ts.map +1 -0
- package/dist/gateway/auth.js +60 -0
- package/dist/gateway/auth.js.map +1 -0
- package/dist/gateway/index.d.ts +1 -0
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +33 -2
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/routes/control.d.ts +6 -0
- package/dist/gateway/routes/control.d.ts.map +1 -1
- package/dist/gateway/routes/control.js +117 -0
- package/dist/gateway/routes/control.js.map +1 -1
- package/dist/gateway/routes/dashboard.d.ts +1 -1
- package/dist/gateway/routes/dashboard.d.ts.map +1 -1
- package/dist/gateway/routes/dashboard.js +144 -53
- package/dist/gateway/routes/dashboard.js.map +1 -1
- package/dist/gateway/views/dashboard-page.d.ts.map +1 -1
- package/dist/gateway/views/dashboard-page.js +93 -20
- package/dist/gateway/views/dashboard-page.js.map +1 -1
- package/dist/gateway/views/login-page.d.ts +2 -0
- package/dist/gateway/views/login-page.d.ts.map +1 -0
- package/dist/gateway/views/login-page.js +54 -0
- package/dist/gateway/views/login-page.js.map +1 -0
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +154 -36
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/runner-pool.d.ts +5 -0
- package/dist/scheduler/runner-pool.d.ts.map +1 -1
- package/dist/scheduler/runner-pool.js +14 -0
- package/dist/scheduler/runner-pool.js.map +1 -1
- package/dist/scheduler/runtime-factory.d.ts +2 -0
- package/dist/scheduler/runtime-factory.d.ts.map +1 -1
- package/dist/scheduler/runtime-factory.js +35 -65
- package/dist/scheduler/runtime-factory.js.map +1 -1
- package/dist/setup/scaffold.d.ts.map +1 -1
- package/dist/setup/scaffold.js +25 -0
- package/dist/setup/scaffold.js.map +1 -1
- package/dist/shared/asm-backend.d.ts.map +1 -1
- package/dist/shared/asm-backend.js +2 -2
- package/dist/shared/asm-backend.js.map +1 -1
- package/dist/shared/config.d.ts +28 -13
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +40 -4
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/constants.d.ts +34 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +34 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/credential-backend.d.ts +1 -1
- package/dist/shared/filesystem-backend.d.ts +1 -1
- package/dist/shared/filesystem-backend.js +1 -1
- package/dist/shared/gsm-backend.d.ts.map +1 -1
- package/dist/shared/gsm-backend.js +2 -2
- package/dist/shared/gsm-backend.js.map +1 -1
- package/dist/shared/paths.d.ts +2 -0
- package/dist/shared/paths.d.ts.map +1 -1
- package/dist/shared/paths.js +3 -1
- package/dist/shared/paths.js.map +1 -1
- package/dist/shared/remote.d.ts +1 -0
- package/dist/shared/remote.d.ts.map +1 -1
- package/dist/shared/remote.js +4 -16
- package/dist/shared/remote.js.map +1 -1
- package/dist/shared/usage.d.ts +22 -0
- package/dist/shared/usage.d.ts.map +1 -0
- package/dist/shared/usage.js +43 -0
- package/dist/shared/usage.js.map +1 -0
- package/dist/telemetry/index.d.ts +57 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +189 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/providers/otel.d.ts +15 -0
- package/dist/telemetry/providers/otel.d.ts.map +1 -0
- package/dist/telemetry/providers/otel.js +77 -0
- package/dist/telemetry/providers/otel.js.map +1 -0
- package/dist/telemetry/providers/xray.d.ts +13 -0
- package/dist/telemetry/providers/xray.d.ts.map +1 -0
- package/dist/telemetry/providers/xray.js +33 -0
- package/dist/telemetry/providers/xray.js.map +1 -0
- package/dist/telemetry/types.d.ts +59 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +2 -0
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/plain-logger.d.ts.map +1 -1
- package/dist/tui/plain-logger.js +8 -2
- package/dist/tui/plain-logger.js.map +1 -1
- package/dist/tui/status-tracker.d.ts +4 -1
- package/dist/tui/status-tracker.d.ts.map +1 -1
- package/dist/tui/status-tracker.js +11 -1
- package/dist/tui/status-tracker.js.map +1 -1
- package/docker/adot-collector-config.yaml +57 -0
- package/package.json +9 -1
- package/dist/cli/commands/cloud-iam.d.ts +0 -17
- package/dist/cli/commands/cloud-iam.d.ts.map +0 -1
- package/dist/cli/commands/cloud-iam.js.map +0 -1
- package/dist/cli/commands/cloud-setup-ecs.d.ts +0 -9
- package/dist/cli/commands/cloud-setup-ecs.d.ts.map +0 -1
- package/dist/cli/commands/cloud-setup-ecs.js.map +0 -1
- package/dist/cloud/deploy-apprunner.d.ts.map +0 -1
- package/dist/cloud/deploy-apprunner.js.map +0 -1
- package/dist/cloud/deploy-cloudrun.d.ts.map +0 -1
- package/dist/cloud/deploy-cloudrun.js.map +0 -1
- package/dist/shared/aws-constants.d.ts.map +0 -1
- package/dist/shared/aws-constants.js.map +0 -1
|
@@ -1,138 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* AWS IAM reconciliation for ECS cloud agents.
|
|
3
3
|
*
|
|
4
|
-
* Extracted from
|
|
5
|
-
*
|
|
4
|
+
* Extracted from cli/commands/cloud-iam.ts into the cloud provider module.
|
|
5
|
+
* Handles per-agent IAM task roles, Lambda roles, and ECR policies.
|
|
6
6
|
*/
|
|
7
|
-
import { execFileSync } from "child_process";
|
|
8
|
-
import { confirm } from "@inquirer/prompts";
|
|
9
7
|
import { STSClient, GetCallerIdentityCommand } from "@aws-sdk/client-sts";
|
|
10
|
-
import { IAMClient, CreateRoleCommand, PutRolePolicyCommand, PutUserPolicyCommand, GetRoleCommand } from "@aws-sdk/client-iam";
|
|
8
|
+
import { IAMClient, CreateRoleCommand, PutRolePolicyCommand, PutUserPolicyCommand, GetRoleCommand, } from "@aws-sdk/client-iam";
|
|
11
9
|
import { ECRClient, SetRepositoryPolicyCommand } from "@aws-sdk/client-ecr";
|
|
12
10
|
import { discoverAgents, loadAgentConfig, loadGlobalConfig } from "../../shared/config.js";
|
|
13
11
|
import { parseCredentialRef } from "../../shared/credentials.js";
|
|
14
|
-
import { AWS_CONSTANTS } from "
|
|
12
|
+
import { AWS_CONSTANTS } from "./constants.js";
|
|
13
|
+
import { CONSTANTS } from "../../shared/constants.js";
|
|
15
14
|
import { ConfigError, CloudProviderError } from "../../shared/errors.js";
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
throw new CloudProviderError(`Unknown cloud provider: "${cloud.provider}"`);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
async function reconcileGcp(projectPath, cloud) {
|
|
28
|
-
const { gcpProject, secretPrefix: configPrefix } = cloud;
|
|
29
|
-
if (!gcpProject) {
|
|
30
|
-
throw new ConfigError("cloud.gcpProject is required in config.toml");
|
|
31
|
-
}
|
|
32
|
-
const secretPrefix = configPrefix || AWS_CONSTANTS.DEFAULT_SECRET_PREFIX;
|
|
33
|
-
// Verify gcloud is available and authenticated
|
|
34
|
-
try {
|
|
35
|
-
gcloud(["auth", "print-access-token"], gcpProject);
|
|
36
|
-
}
|
|
37
|
-
catch (err) {
|
|
38
|
-
throw new CloudProviderError("gcloud CLI is not authenticated. Run 'gcloud auth login' first.\n" +
|
|
39
|
-
`Original error: ${err.message}`);
|
|
40
|
-
}
|
|
41
|
-
const agents = discoverAgents(projectPath);
|
|
42
|
-
if (agents.length === 0) {
|
|
43
|
-
console.log("No agents found. Create agents first.");
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
// Pre-flight: check if any secrets exist in GSM with this prefix
|
|
47
|
-
const preflight = listGsmSecretCount(gcpProject, secretPrefix);
|
|
48
|
-
if (preflight === 0) {
|
|
49
|
-
console.log(`\nWarning: No secrets found in GSM with prefix "${secretPrefix}".\n` +
|
|
50
|
-
`IAM bindings are created against existing secrets, so you should push credentials first.\n`);
|
|
51
|
-
const proceed = await confirm({
|
|
52
|
-
message: "Continue anyway? (Service accounts will be created but no secrets will be bound)",
|
|
53
|
-
default: false,
|
|
54
|
-
});
|
|
55
|
-
if (!proceed) {
|
|
56
|
-
console.log("Aborted. Push credentials first, then re-run.");
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
console.log(`\nSetting up Cloud Run service accounts for ${agents.length} agent(s)...\n`);
|
|
61
|
-
for (const name of agents) {
|
|
62
|
-
const config = loadAgentConfig(projectPath, name);
|
|
63
|
-
const saName = AWS_CONSTANTS.serviceAccountName(name);
|
|
64
|
-
const saEmail = AWS_CONSTANTS.serviceAccountEmail(name, gcpProject);
|
|
65
|
-
console.log(` Agent: ${name}`);
|
|
66
|
-
console.log(` SA: ${saEmail}`);
|
|
67
|
-
// 1. Create service account (idempotent)
|
|
68
|
-
try {
|
|
69
|
-
gcloud([
|
|
70
|
-
"iam", "service-accounts", "create", saName,
|
|
71
|
-
"--display-name", `Action Llama agent: ${name}`,
|
|
72
|
-
"--project", gcpProject,
|
|
73
|
-
], gcpProject);
|
|
74
|
-
console.log(` Created service account`);
|
|
75
|
-
}
|
|
76
|
-
catch (err) {
|
|
77
|
-
if (err.message?.includes("already exists")) {
|
|
78
|
-
console.log(` Service account already exists`);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
throw err;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
// 2. Collect all secret names this agent needs
|
|
85
|
-
const credRefs = [...new Set(config.credentials)];
|
|
86
|
-
if (config.model.authType !== "pi_auth" && !credRefs.includes("anthropic_key:default")) {
|
|
87
|
-
credRefs.push("anthropic_key:default");
|
|
88
|
-
}
|
|
89
|
-
const secretNames = [];
|
|
90
|
-
for (const ref of credRefs) {
|
|
91
|
-
const { type, instance } = parseCredentialRef(ref);
|
|
92
|
-
const fields = listGsmFields(gcpProject, secretPrefix, type, instance);
|
|
93
|
-
for (const field of fields) {
|
|
94
|
-
secretNames.push(`${secretPrefix}--${type}--${instance}--${field}`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
// 3. Grant secretmanager.secretAccessor on each secret
|
|
98
|
-
let boundCount = 0;
|
|
99
|
-
for (const secretName of secretNames) {
|
|
100
|
-
try {
|
|
101
|
-
gcloud([
|
|
102
|
-
"secrets", "add-iam-policy-binding", secretName,
|
|
103
|
-
"--member", `serviceAccount:${saEmail}`,
|
|
104
|
-
"--role", "roles/secretmanager.secretAccessor",
|
|
105
|
-
"--project", gcpProject,
|
|
106
|
-
], gcpProject);
|
|
107
|
-
boundCount++;
|
|
108
|
-
}
|
|
109
|
-
catch (err) {
|
|
110
|
-
if (err.message?.includes("already exists") || err.message?.includes("already has")) {
|
|
111
|
-
boundCount++;
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
console.log(` Warning: failed to bind ${secretName}: ${err.message}`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
console.log(` Bound ${boundCount} secret(s)`);
|
|
119
|
-
// 4. Grant the SA permission to act as itself (for Cloud Run job execution)
|
|
120
|
-
try {
|
|
121
|
-
gcloud([
|
|
122
|
-
"iam", "service-accounts", "add-iam-policy-binding", saEmail,
|
|
123
|
-
"--member", `serviceAccount:${saEmail}`,
|
|
124
|
-
"--role", "roles/iam.serviceAccountUser",
|
|
125
|
-
"--project", gcpProject,
|
|
126
|
-
], gcpProject);
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
// May already be bound
|
|
130
|
-
}
|
|
131
|
-
console.log("");
|
|
132
|
-
}
|
|
133
|
-
console.log("Done. Each agent now has an isolated service account with access to only its declared secrets.");
|
|
134
|
-
}
|
|
135
|
-
async function reconcileAws(projectPath, cloud) {
|
|
15
|
+
/**
|
|
16
|
+
* Reconcile per-agent ECS task roles and Secrets Manager policies.
|
|
17
|
+
*
|
|
18
|
+
* Creates an IAM task role for each agent with a trust policy for
|
|
19
|
+
* ecs-tasks.amazonaws.com, then attaches an inline policy granting
|
|
20
|
+
* secretsmanager:GetSecretValue on each agent's declared credentials.
|
|
21
|
+
*/
|
|
22
|
+
export async function reconcileAwsAgents(projectPath, cloud) {
|
|
136
23
|
const { awsRegion, ecrRepository, awsSecretPrefix } = cloud;
|
|
137
24
|
if (!awsRegion) {
|
|
138
25
|
throw new ConfigError("cloud.awsRegion is required in config.toml");
|
|
@@ -140,7 +27,7 @@ async function reconcileAws(projectPath, cloud) {
|
|
|
140
27
|
if (!ecrRepository) {
|
|
141
28
|
throw new ConfigError("cloud.ecrRepository is required in config.toml");
|
|
142
29
|
}
|
|
143
|
-
const secretPrefix = awsSecretPrefix ||
|
|
30
|
+
const secretPrefix = awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX;
|
|
144
31
|
// Extract account ID from ECR repo URI
|
|
145
32
|
const accountMatch = ecrRepository.match(/^(\d+)\.dkr\.ecr\./);
|
|
146
33
|
if (!accountMatch) {
|
|
@@ -325,54 +212,9 @@ export async function grantPassRole(awsRegion, iamClient, roleArns, policyName)
|
|
|
325
212
|
}
|
|
326
213
|
}
|
|
327
214
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
timeout: 30_000,
|
|
332
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
333
|
-
}).trim();
|
|
334
|
-
}
|
|
335
|
-
function listGsmSecretCount(gcpProject, prefix) {
|
|
336
|
-
try {
|
|
337
|
-
const output = gcloud([
|
|
338
|
-
"secrets", "list",
|
|
339
|
-
"--filter", `name:${prefix}--`,
|
|
340
|
-
"--format", "value(name)",
|
|
341
|
-
"--project", gcpProject,
|
|
342
|
-
], gcpProject);
|
|
343
|
-
if (!output.trim())
|
|
344
|
-
return 0;
|
|
345
|
-
return output.trim().split("\n").length;
|
|
346
|
-
}
|
|
347
|
-
catch {
|
|
348
|
-
return 0;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
function listGsmFields(gcpProject, prefix, type, instance) {
|
|
352
|
-
const filter = `name:${prefix}--${type}--${instance}--`;
|
|
353
|
-
try {
|
|
354
|
-
const output = gcloud([
|
|
355
|
-
"secrets", "list",
|
|
356
|
-
"--filter", filter,
|
|
357
|
-
"--format", "value(name)",
|
|
358
|
-
"--project", gcpProject,
|
|
359
|
-
], gcpProject);
|
|
360
|
-
if (!output.trim())
|
|
361
|
-
return [];
|
|
362
|
-
const fields = [];
|
|
363
|
-
for (const line of output.split("\n")) {
|
|
364
|
-
const secretId = line.trim().split("/").pop();
|
|
365
|
-
const parts = secretId.split("--");
|
|
366
|
-
if (parts.length === 4 && parts[0] === prefix && parts[1] === type && parts[2] === instance) {
|
|
367
|
-
fields.push(parts[3]);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
return fields;
|
|
371
|
-
}
|
|
372
|
-
catch {
|
|
373
|
-
return [];
|
|
374
|
-
}
|
|
375
|
-
}
|
|
215
|
+
/**
|
|
216
|
+
* Validate that per-agent ECS task roles exist and have correct trust policies.
|
|
217
|
+
*/
|
|
376
218
|
export async function validateEcsRoles(projectPath, cloud) {
|
|
377
219
|
const { awsRegion } = cloud;
|
|
378
220
|
if (!awsRegion) {
|
|
@@ -443,7 +285,10 @@ export async function validateEcsRoles(projectPath, cloud) {
|
|
|
443
285
|
console.log(`All ${agents.length} IAM task role(s) exist and have correct trust policies.`);
|
|
444
286
|
}
|
|
445
287
|
}
|
|
446
|
-
|
|
288
|
+
/**
|
|
289
|
+
* Ensure the ECR repository policy grants Lambda pull access.
|
|
290
|
+
*/
|
|
291
|
+
export async function ensureLambdaEcrPolicy(awsRegion, ecrRepoUri) {
|
|
447
292
|
const repoName = ecrRepoUri.split("/").pop();
|
|
448
293
|
if (!repoName)
|
|
449
294
|
return;
|
|
@@ -471,11 +316,17 @@ async function ensureLambdaEcrPolicy(awsRegion, ecrRepoUri) {
|
|
|
471
316
|
console.log(`Warning: could not set ECR repository policy for Lambda: ${err.message}`);
|
|
472
317
|
}
|
|
473
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* Reconcile per-agent Lambda execution roles for agents with short timeouts.
|
|
321
|
+
*
|
|
322
|
+
* Agents with timeout <= LAMBDA_MAX_TIMEOUT are automatically routed to Lambda.
|
|
323
|
+
* Each gets an IAM role with Secrets Manager, ECR, and CloudWatch Logs access.
|
|
324
|
+
*/
|
|
474
325
|
export async function reconcileLambdaRoles(projectPath, cloud) {
|
|
475
326
|
const { awsRegion, ecrRepository, awsSecretPrefix } = cloud;
|
|
476
327
|
if (!awsRegion || !ecrRepository)
|
|
477
328
|
return;
|
|
478
|
-
const secretPrefix = awsSecretPrefix ||
|
|
329
|
+
const secretPrefix = awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX;
|
|
479
330
|
const accountMatch = ecrRepository.match(/^(\d+)\.dkr\.ecr\./);
|
|
480
331
|
if (!accountMatch)
|
|
481
332
|
return;
|
|
@@ -588,4 +439,4 @@ export async function reconcileLambdaRoles(projectPath, cloud) {
|
|
|
588
439
|
await grantPassRole(awsRegion, iamClient, lambdaRoleArns, "ActionLlamaLambdaPassRole");
|
|
589
440
|
}
|
|
590
441
|
}
|
|
591
|
-
//# sourceMappingURL=
|
|
442
|
+
//# sourceMappingURL=iam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam.js","sourceRoot":"","sources":["../../../src/cloud/aws/iam.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS (ECS) cloud provider implementation.
|
|
3
|
+
*
|
|
4
|
+
* Wraps EcsCloudConfig and delegates to the extracted AWS modules
|
|
5
|
+
* (provision, teardown, iam, deploy) via the CloudProvider interface.
|
|
6
|
+
*/
|
|
7
|
+
import type { EcsCloudConfig, AgentConfig, GlobalConfig } from "../../shared/config.js";
|
|
8
|
+
import type { ContainerRuntime } from "../../docker/runtime.js";
|
|
9
|
+
import type { CredentialBackend } from "../../shared/credential-backend.js";
|
|
10
|
+
import type { CloudProvider, SchedulerServiceInfo, RuntimeResult } from "../provider.js";
|
|
11
|
+
export declare class AwsCloudProvider implements CloudProvider {
|
|
12
|
+
readonly providerName: "ecs";
|
|
13
|
+
private config;
|
|
14
|
+
constructor(config: EcsCloudConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Interactive provisioning wizard. Runs the ECS setup flow and
|
|
17
|
+
* returns config fields to write to config.toml.
|
|
18
|
+
*/
|
|
19
|
+
provision(): Promise<Record<string, unknown> | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Tear down all provisioned AWS cloud resources for this project.
|
|
22
|
+
*/
|
|
23
|
+
teardown(projectPath: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Reconcile per-agent IAM resources (ECS task roles + Lambda roles).
|
|
26
|
+
*/
|
|
27
|
+
reconcileAgents(projectPath: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Validate that per-agent IAM task roles exist and are correctly configured.
|
|
30
|
+
*/
|
|
31
|
+
validateRoles(projectPath: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Create the primary ECS Fargate container runtime.
|
|
34
|
+
*/
|
|
35
|
+
createRuntime(): ContainerRuntime;
|
|
36
|
+
/**
|
|
37
|
+
* Create a runtime for a specific agent.
|
|
38
|
+
*
|
|
39
|
+
* Agents with timeout <= LAMBDA_MAX_TIMEOUT are routed to Lambda
|
|
40
|
+
* for faster cold starts and lower cost. All others use ECS Fargate.
|
|
41
|
+
*/
|
|
42
|
+
createAgentRuntime(agentConfig: AgentConfig, globalConfig: GlobalConfig): ContainerRuntime;
|
|
43
|
+
/**
|
|
44
|
+
* Create primary ECS runtime + per-agent Lambda overrides for
|
|
45
|
+
* agents with short timeouts.
|
|
46
|
+
*/
|
|
47
|
+
createRuntimes(activeAgentConfigs: AgentConfig[], globalConfig: GlobalConfig): RuntimeResult;
|
|
48
|
+
/**
|
|
49
|
+
* Create an AWS Secrets Manager credential backend.
|
|
50
|
+
*/
|
|
51
|
+
createCredentialBackend(): Promise<CredentialBackend>;
|
|
52
|
+
/**
|
|
53
|
+
* Deploy the scheduler as an App Runner service.
|
|
54
|
+
*/
|
|
55
|
+
deployScheduler(imageUri: string): Promise<SchedulerServiceInfo>;
|
|
56
|
+
/**
|
|
57
|
+
* Get the current scheduler App Runner service status.
|
|
58
|
+
*/
|
|
59
|
+
getSchedulerStatus(): Promise<SchedulerServiceInfo | null>;
|
|
60
|
+
/**
|
|
61
|
+
* Fetch recent scheduler logs from CloudWatch.
|
|
62
|
+
*/
|
|
63
|
+
getSchedulerLogs(limit: number): Promise<string[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Tear down the scheduler App Runner service only.
|
|
66
|
+
*/
|
|
67
|
+
teardownScheduler(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/cloud/aws/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,aAAa,EACd,MAAM,gBAAgB,CAAC;AAMxB,qBAAa,gBAAiB,YAAW,aAAa;IACpD,QAAQ,CAAC,YAAY,EAAG,KAAK,CAAU;IACvC,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAIlC;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAY1D;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD;;OAEG;IACH,aAAa,IAAI,gBAAgB;IAcjC;;;;;OAKG;IACH,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,GAAG,gBAAgB;IAkB1F;;;OAGG;IACH,cAAc,CAAC,kBAAkB,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,GAAG,aAAa;IA8B5F;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAQ3D;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IActE;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAYhE;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKxD;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAIzC"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS (ECS) cloud provider implementation.
|
|
3
|
+
*
|
|
4
|
+
* Wraps EcsCloudConfig and delegates to the extracted AWS modules
|
|
5
|
+
* (provision, teardown, iam, deploy) via the CloudProvider interface.
|
|
6
|
+
*/
|
|
7
|
+
import { ECSFargateRuntime } from "../../docker/ecs-runtime.js";
|
|
8
|
+
import { LambdaRuntime } from "../../docker/lambda-runtime.js";
|
|
9
|
+
import { AWS_CONSTANTS } from "./constants.js";
|
|
10
|
+
import { CONSTANTS } from "../../shared/constants.js";
|
|
11
|
+
export class AwsCloudProvider {
|
|
12
|
+
providerName = "ecs";
|
|
13
|
+
config;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Interactive provisioning wizard. Runs the ECS setup flow and
|
|
19
|
+
* returns config fields to write to config.toml.
|
|
20
|
+
*/
|
|
21
|
+
async provision() {
|
|
22
|
+
const { setupEcsCloud } = await import("./provision.js");
|
|
23
|
+
// setupEcsCloud mutates the config object in place and returns success/failure
|
|
24
|
+
const configCopy = { ...this.config };
|
|
25
|
+
const success = await setupEcsCloud(configCopy);
|
|
26
|
+
if (!success) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
// Return the full mutated config as a flat record
|
|
30
|
+
return configCopy;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Tear down all provisioned AWS cloud resources for this project.
|
|
34
|
+
*/
|
|
35
|
+
async teardown(projectPath) {
|
|
36
|
+
const { teardownAws } = await import("./teardown.js");
|
|
37
|
+
await teardownAws(projectPath, this.config);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Reconcile per-agent IAM resources (ECS task roles + Lambda roles).
|
|
41
|
+
*/
|
|
42
|
+
async reconcileAgents(projectPath) {
|
|
43
|
+
const { reconcileAwsAgents, reconcileLambdaRoles } = await import("./iam.js");
|
|
44
|
+
await reconcileAwsAgents(projectPath, this.config);
|
|
45
|
+
await reconcileLambdaRoles(projectPath, this.config);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate that per-agent IAM task roles exist and are correctly configured.
|
|
49
|
+
*/
|
|
50
|
+
async validateRoles(projectPath) {
|
|
51
|
+
const { validateEcsRoles } = await import("./iam.js");
|
|
52
|
+
await validateEcsRoles(projectPath, this.config);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create the primary ECS Fargate container runtime.
|
|
56
|
+
*/
|
|
57
|
+
createRuntime() {
|
|
58
|
+
return new ECSFargateRuntime({
|
|
59
|
+
awsRegion: this.config.awsRegion,
|
|
60
|
+
ecsCluster: this.config.ecsCluster,
|
|
61
|
+
ecrRepository: this.config.ecrRepository,
|
|
62
|
+
executionRoleArn: this.config.executionRoleArn,
|
|
63
|
+
taskRoleArn: this.config.taskRoleArn,
|
|
64
|
+
subnets: this.config.subnets,
|
|
65
|
+
securityGroups: this.config.securityGroups,
|
|
66
|
+
secretPrefix: this.config.awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX,
|
|
67
|
+
buildBucket: this.config.buildBucket,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create a runtime for a specific agent.
|
|
72
|
+
*
|
|
73
|
+
* Agents with timeout <= LAMBDA_MAX_TIMEOUT are routed to Lambda
|
|
74
|
+
* for faster cold starts and lower cost. All others use ECS Fargate.
|
|
75
|
+
*/
|
|
76
|
+
createAgentRuntime(agentConfig, globalConfig) {
|
|
77
|
+
const effectiveTimeout = agentConfig.timeout ?? globalConfig.local?.timeout ?? 900;
|
|
78
|
+
if (effectiveTimeout <= AWS_CONSTANTS.LAMBDA_MAX_TIMEOUT) {
|
|
79
|
+
return new LambdaRuntime({
|
|
80
|
+
awsRegion: this.config.awsRegion,
|
|
81
|
+
ecrRepository: this.config.ecrRepository,
|
|
82
|
+
secretPrefix: this.config.awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX,
|
|
83
|
+
buildBucket: this.config.buildBucket,
|
|
84
|
+
lambdaRoleArn: this.config.lambdaRoleArn,
|
|
85
|
+
lambdaSubnets: this.config.lambdaSubnets,
|
|
86
|
+
lambdaSecurityGroups: this.config.lambdaSecurityGroups,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return this.createRuntime();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create primary ECS runtime + per-agent Lambda overrides for
|
|
93
|
+
* agents with short timeouts.
|
|
94
|
+
*/
|
|
95
|
+
createRuntimes(activeAgentConfigs, globalConfig) {
|
|
96
|
+
const runtime = this.createRuntime();
|
|
97
|
+
const agentRuntimeOverrides = {};
|
|
98
|
+
// Check which agents should be routed to Lambda
|
|
99
|
+
let lambdaRuntime = null;
|
|
100
|
+
for (const agentConfig of activeAgentConfigs) {
|
|
101
|
+
const effectiveTimeout = agentConfig.timeout ?? globalConfig.local?.timeout ?? 900;
|
|
102
|
+
if (effectiveTimeout <= AWS_CONSTANTS.LAMBDA_MAX_TIMEOUT) {
|
|
103
|
+
// Lazily create a single shared Lambda runtime
|
|
104
|
+
if (!lambdaRuntime) {
|
|
105
|
+
lambdaRuntime = new LambdaRuntime({
|
|
106
|
+
awsRegion: this.config.awsRegion,
|
|
107
|
+
ecrRepository: this.config.ecrRepository,
|
|
108
|
+
secretPrefix: this.config.awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX,
|
|
109
|
+
buildBucket: this.config.buildBucket,
|
|
110
|
+
lambdaRoleArn: this.config.lambdaRoleArn,
|
|
111
|
+
lambdaSubnets: this.config.lambdaSubnets,
|
|
112
|
+
lambdaSecurityGroups: this.config.lambdaSecurityGroups,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
agentRuntimeOverrides[agentConfig.name] = lambdaRuntime;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { runtime, agentRuntimeOverrides };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create an AWS Secrets Manager credential backend.
|
|
122
|
+
*/
|
|
123
|
+
async createCredentialBackend() {
|
|
124
|
+
const { AwsSecretsManagerBackend } = await import("../../shared/asm-backend.js");
|
|
125
|
+
return new AwsSecretsManagerBackend(this.config.awsRegion, this.config.awsSecretPrefix || CONSTANTS.DEFAULT_SECRET_PREFIX);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Deploy the scheduler as an App Runner service.
|
|
129
|
+
*/
|
|
130
|
+
async deployScheduler(imageUri) {
|
|
131
|
+
const { deployAppRunner } = await import("./deploy.js");
|
|
132
|
+
const result = await deployAppRunner({
|
|
133
|
+
imageUri,
|
|
134
|
+
cloudConfig: this.config,
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
serviceUrl: result.serviceUrl,
|
|
138
|
+
status: result.status,
|
|
139
|
+
createdAt: result.createdAt,
|
|
140
|
+
updatedAt: result.updatedAt,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get the current scheduler App Runner service status.
|
|
145
|
+
*/
|
|
146
|
+
async getSchedulerStatus() {
|
|
147
|
+
const { getAppRunnerStatus } = await import("./deploy.js");
|
|
148
|
+
const result = await getAppRunnerStatus(this.config);
|
|
149
|
+
if (!result)
|
|
150
|
+
return null;
|
|
151
|
+
return {
|
|
152
|
+
serviceUrl: result.serviceUrl,
|
|
153
|
+
status: result.status,
|
|
154
|
+
createdAt: result.createdAt,
|
|
155
|
+
updatedAt: result.updatedAt,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Fetch recent scheduler logs from CloudWatch.
|
|
160
|
+
*/
|
|
161
|
+
async getSchedulerLogs(limit) {
|
|
162
|
+
const { getAppRunnerLogs } = await import("./deploy.js");
|
|
163
|
+
return getAppRunnerLogs(this.config, limit);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Tear down the scheduler App Runner service only.
|
|
167
|
+
*/
|
|
168
|
+
async teardownScheduler() {
|
|
169
|
+
const { teardownAppRunner } = await import("./deploy.js");
|
|
170
|
+
await teardownAppRunner(this.config);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/cloud/aws/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ECS-specific cloud provisioning logic.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from cli/commands/cloud-setup-ecs.ts into the cloud provider module.
|
|
5
|
+
* Contains all AWS resource creation/discovery for ECS Fargate setup.
|
|
6
|
+
*/
|
|
7
|
+
import type { EcsCloudConfig } from "../../shared/config.js";
|
|
8
|
+
export declare function setupEcsCloud(cloud: EcsCloudConfig): Promise<boolean>;
|
|
9
|
+
//# sourceMappingURL=provision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../../src/cloud/aws/provision.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsCH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAO7D,wBAAsB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA2L3E"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ECS-specific cloud
|
|
2
|
+
* ECS-specific cloud provisioning logic.
|
|
3
3
|
*
|
|
4
|
-
* Extracted from cloud-setup.ts
|
|
4
|
+
* Extracted from cli/commands/cloud-setup-ecs.ts into the cloud provider module.
|
|
5
5
|
* Contains all AWS resource creation/discovery for ECS Fargate setup.
|
|
6
6
|
*/
|
|
7
7
|
import { select, input, confirm } from "@inquirer/prompts";
|
|
@@ -11,7 +11,8 @@ import { ECSClient, ListClustersCommand, DescribeClustersCommand, CreateClusterC
|
|
|
11
11
|
import { IAMClient, ListRolesCommand, CreateRoleCommand, GetRoleCommand, AttachRolePolicyCommand, PutRolePolicyCommand, PutUserPolicyCommand, CreateServiceLinkedRoleCommand, } from "@aws-sdk/client-iam";
|
|
12
12
|
import { EC2Client, DescribeVpcsCommand, DescribeSubnetsCommand, DescribeSecurityGroupsCommand, } from "@aws-sdk/client-ec2";
|
|
13
13
|
import { CloudWatchLogsClient, CreateLogGroupCommand, } from "@aws-sdk/client-cloudwatch-logs";
|
|
14
|
-
import { AWS_CONSTANTS } from "
|
|
14
|
+
import { AWS_CONSTANTS } from "./constants.js";
|
|
15
|
+
import { CONSTANTS } from "../../shared/constants.js";
|
|
15
16
|
const CREATE_NEW = "__create_new__";
|
|
16
17
|
const MANUAL_INPUT = "__manual_input__";
|
|
17
18
|
export async function setupEcsCloud(cloud) {
|
|
@@ -51,7 +52,7 @@ export async function setupEcsCloud(cloud) {
|
|
|
51
52
|
cloud.taskRoleArn = await pickOrCreateEcsRole(iamClient, "Default task role (Secrets Manager access)", AWS_CONSTANTS.DEFAULT_TASK_ROLE, [], [cloud.executionRoleArn]);
|
|
52
53
|
// Add Secrets Manager + CloudWatch Logs inline policy to execution role
|
|
53
54
|
const executionRoleName = cloud.executionRoleArn.split("/").pop();
|
|
54
|
-
const secretPrefix =
|
|
55
|
+
const secretPrefix = CONSTANTS.DEFAULT_SECRET_PREFIX;
|
|
55
56
|
try {
|
|
56
57
|
await iamClient.send(new PutRolePolicyCommand({
|
|
57
58
|
RoleName: executionRoleName,
|
|
@@ -103,8 +104,8 @@ export async function setupEcsCloud(cloud) {
|
|
|
103
104
|
const sgs = await pickSecurityGroups(ec2Client, result.vpcId);
|
|
104
105
|
if (sgs.length > 0)
|
|
105
106
|
cloud.securityGroups = sgs;
|
|
106
|
-
const prefix = await input({ message: "Secret prefix:", default:
|
|
107
|
-
if (prefix !==
|
|
107
|
+
const prefix = await input({ message: "Secret prefix:", default: CONSTANTS.DEFAULT_SECRET_PREFIX });
|
|
108
|
+
if (prefix !== CONSTANTS.DEFAULT_SECRET_PREFIX)
|
|
108
109
|
cloud.awsSecretPrefix = prefix;
|
|
109
110
|
// Grant iam:PassRole, logs read, and iam:PutUserPolicy to the calling
|
|
110
111
|
// IAM user so that al start/run can assign roles, al logs can read
|
|
@@ -648,8 +649,8 @@ async function ensureAppRunnerInstanceRole(iamClient, accountId, region, ecrRepo
|
|
|
648
649
|
{ Sid: "PassRole", Effect: "Allow", Action: "iam:PassRole", Resource: `arn:aws:iam::${accountId}:role/al-*`, Condition: { StringEquals: { "iam:PassedToService": ["ecs-tasks.amazonaws.com", "codebuild.amazonaws.com", "lambda.amazonaws.com", "apprunner.amazonaws.com"] } } },
|
|
649
650
|
{ Sid: "IAMAgentRoles", Effect: "Allow", Action: ["iam:CreateRole", "iam:GetRole", "iam:GetRolePolicy", "iam:PutRolePolicy", "iam:DeleteRole", "iam:DeleteRolePolicy", "iam:AttachRolePolicy"], Resource: `arn:aws:iam::${accountId}:role/al-*` },
|
|
650
651
|
{ Sid: "IAMListRoles", Effect: "Allow", Action: "iam:ListRoles", Resource: "*" },
|
|
651
|
-
{ Sid: "ECR", Effect: "Allow", Action: ["ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer", "ecr:BatchCheckLayerAvailability", "ecr:GetAuthorizationToken", "ecr:SetRepositoryPolicy"], Resource: "*" },
|
|
652
|
-
{ Sid: "CodeBuild", Effect: "Allow", Action: ["codebuild:StartBuild", "codebuild:BatchGetBuilds", "codebuild:CreateProject"], Resource: `arn:aws:codebuild:${region}:${accountId}:project/al-image-builder` },
|
|
652
|
+
{ Sid: "ECR", Effect: "Allow", Action: ["ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer", "ecr:BatchCheckLayerAvailability", "ecr:GetAuthorizationToken", "ecr:SetRepositoryPolicy", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload"], Resource: "*" },
|
|
653
|
+
{ Sid: "CodeBuild", Effect: "Allow", Action: ["codebuild:StartBuild", "codebuild:BatchGetBuilds", "codebuild:CreateProject", "codebuild:UpdateProject"], Resource: `arn:aws:codebuild:${region}:${accountId}:project/al-image-builder` },
|
|
653
654
|
{ Sid: "Lambda", Effect: "Allow", Action: ["lambda:GetFunction", "lambda:CreateFunction", "lambda:UpdateFunctionCode", "lambda:UpdateFunctionConfiguration", "lambda:PutFunctionEventInvokeConfig", "lambda:InvokeFunction"], Resource: `arn:aws:lambda:${region}:${accountId}:function:al-*` },
|
|
654
655
|
{ Sid: "S3", Effect: "Allow", Action: ["s3:CreateBucket", "s3:PutObject", "s3:GetObject", "s3:ListBucket"], Resource: [`arn:aws:s3:::${bucketName}`, `arn:aws:s3:::${bucketName}/*`] },
|
|
655
656
|
{ Sid: "AppRunner", Effect: "Allow", Action: ["apprunner:CreateService", "apprunner:UpdateService", "apprunner:DescribeService", "apprunner:DeleteService"], Resource: `arn:aws:apprunner:${region}:${accountId}:service/al-scheduler/*` },
|
|
@@ -694,4 +695,4 @@ async function pickSecurityGroups(ec2Client, vpcId) {
|
|
|
694
695
|
const raw = await input({ message: "Security group IDs (comma-separated, optional):" });
|
|
695
696
|
return raw.trim() ? raw.split(",").map(s => s.trim()).filter(Boolean) : [];
|
|
696
697
|
}
|
|
697
|
-
//# sourceMappingURL=
|
|
698
|
+
//# sourceMappingURL=provision.js.map
|