Skip to content

Commit 7d7dffd

Browse files
authored
Fix: Runtime configure function now sets CodeBuild execution role from --code_build_execution_role parameter (#184)
* codebuild role parameter added * codebuild role parameter added * codebuild role parameter added * unit test added * unit test added * unit test added * PR 184
1 parent 6459979 commit 7d7dffd

File tree

6 files changed

+145
-217
lines changed

6 files changed

+145
-217
lines changed

src/bedrock_agentcore_starter_toolkit/cli/runtime/commands.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ def configure(
167167
entrypoint: Optional[str] = typer.Option(None, "--entrypoint", "-e", help="Python file with BedrockAgentCoreApp"),
168168
agent_name: Optional[str] = typer.Option(None, "--name", "-n"),
169169
execution_role: Optional[str] = typer.Option(None, "--execution-role", "-er"),
170+
code_build_execution_role: Optional[str] = typer.Option(None, "--code-build-execution-role", "-cber"),
170171
ecr_repository: Optional[str] = typer.Option(None, "--ecr", "-ecr"),
171172
container_runtime: Optional[str] = typer.Option(None, "--container-runtime", "-ctr"),
172173
requirements_file: Optional[str] = typer.Option(
@@ -268,6 +269,7 @@ def configure(
268269
agent_name=agent_name,
269270
entrypoint_path=Path(entrypoint),
270271
execution_role=execution_role,
272+
code_build_execution_role=code_build_execution_role,
271273
ecr_repository=ecr_repository,
272274
container_runtime=container_runtime,
273275
auto_create_ecr=auto_create_ecr,

src/bedrock_agentcore_starter_toolkit/notebook/runtime/bedrock_agentcore.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def configure(
3535
self,
3636
entrypoint: str,
3737
execution_role: Optional[str] = None,
38+
code_build_execution_role: Optional[str] = None,
3839
agent_name: Optional[str] = None,
3940
requirements: Optional[List[str]] = None,
4041
requirements_file: Optional[str] = None,
@@ -53,6 +54,7 @@ def configure(
5354
entrypoint: Path to Python file with optional Bedrock AgentCore name
5455
(e.g., "handler.py" or "handler.py:bedrock_agentcore")
5556
execution_role: AWS IAM execution role ARN or name (optional if auto_create_execution_role=True)
57+
code_build_execution_role: Optional separate CodeBuild execution role ARN or name
5658
agent_name: name of the agent
5759
requirements: Optional list of requirements to generate requirements.txt
5860
requirements_file: Optional path to existing requirements file
@@ -109,6 +111,7 @@ def configure(
109111
entrypoint_path=Path(file_path),
110112
auto_create_execution_role=auto_create_execution_role,
111113
execution_role=execution_role,
114+
code_build_execution_role=code_build_execution_role,
112115
ecr_repository=ecr_repository,
113116
container_runtime=container_runtime,
114117
auto_create_ecr=auto_create_ecr,

src/bedrock_agentcore_starter_toolkit/operations/runtime/configure.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
AWSConfig,
1313
BedrockAgentCoreAgentSchema,
1414
BedrockAgentCoreDeploymentInfo,
15+
CodeBuildConfig,
1516
NetworkConfiguration,
1617
ObservabilityConfig,
1718
ProtocolConfiguration,
@@ -25,6 +26,7 @@ def configure_bedrock_agentcore(
2526
agent_name: str,
2627
entrypoint_path: Path,
2728
execution_role: Optional[str] = None,
29+
code_build_execution_role: Optional[str] = None,
2830
ecr_repository: Optional[str] = None,
2931
container_runtime: Optional[str] = None,
3032
auto_create_ecr: bool = True,
@@ -43,6 +45,7 @@ def configure_bedrock_agentcore(
4345
agent_name: name of the agent,
4446
entrypoint_path: Path to the entrypoint file
4547
execution_role: AWS execution role ARN or name (auto-created if not provided)
48+
code_build_execution_role: CodeBuild execution role ARN or name (uses execution_role if not provided)
4649
ecr_repository: ECR repository URI
4750
container_runtime: Container runtime to use
4851
auto_create_ecr: Whether to auto-create ECR repository
@@ -109,6 +112,24 @@ def configure_bedrock_agentcore(
109112
else:
110113
log.debug("No execution role provided and auto-create disabled")
111114

115+
# Handle CodeBuild execution role - use separate role if provided, otherwise use execution_role
116+
codebuild_execution_role_arn = None
117+
if code_build_execution_role:
118+
# User provided a separate CodeBuild role
119+
if code_build_execution_role.startswith("arn:aws:iam::"):
120+
codebuild_execution_role_arn = code_build_execution_role
121+
else:
122+
codebuild_execution_role_arn = f"arn:aws:iam::{account_id}:role/{code_build_execution_role}"
123+
124+
if verbose:
125+
log.debug("Using separate CodeBuild execution role: %s", codebuild_execution_role_arn)
126+
else:
127+
# No separate CodeBuild role provided - use None
128+
codebuild_execution_role_arn = None
129+
130+
if verbose and execution_role_arn:
131+
log.debug("Using same role for CodeBuild: %s", codebuild_execution_role_arn)
132+
112133
# Generate Dockerfile and .dockerignore
113134
bedrock_agentcore_name = None
114135
# Try to find the variable name for the Bedrock AgentCore instance in the file
@@ -195,6 +216,9 @@ def configure_bedrock_agentcore(
195216
observability=ObservabilityConfig(enabled=enable_observability),
196217
),
197218
bedrock_agentcore=BedrockAgentCoreDeploymentInfo(),
219+
codebuild=CodeBuildConfig(
220+
execution_role=codebuild_execution_role_arn,
221+
),
198222
authorizer_configuration=authorizer_configuration,
199223
request_header_configuration=request_header_configuration,
200224
)

tests/cli/runtime/test_commands.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,51 @@ def test_configure_with_oauth(self, tmp_path):
126126
call_args = mock_configure.call_args
127127
assert call_args[1]["authorizer_configuration"] == oauth_config
128128

129+
def test_configure_with_code_build_execution_role(self, tmp_path):
130+
"""Test configure command with CodeBuild execution role."""
131+
agent_file = tmp_path / "test_agent.py"
132+
agent_file.write_text("from bedrock_agentcore.runtime import BedrockAgentCoreApp\napp = BedrockAgentCoreApp()")
133+
134+
with (
135+
patch(
136+
"bedrock_agentcore_starter_toolkit.cli.runtime.commands.configure_bedrock_agentcore"
137+
) as mock_configure,
138+
patch("bedrock_agentcore_starter_toolkit.cli.runtime.commands.parse_entrypoint") as mock_parse,
139+
patch(
140+
"bedrock_agentcore_starter_toolkit.cli.runtime.commands._handle_requirements_file_display"
141+
) as mock_req_display,
142+
patch("bedrock_agentcore_starter_toolkit.cli.common.prompt") as mock_prompt,
143+
):
144+
mock_parse.return_value = (str(agent_file), "bedrock_agentcore")
145+
mock_req_display.return_value = tmp_path / "requirements.txt"
146+
mock_prompt.return_value = "no"
147+
148+
mock_result = Mock()
149+
mock_result.runtime = "docker"
150+
mock_result.region = "us-west-2"
151+
mock_result.account_id = "123456789012"
152+
mock_result.execution_role = "arn:aws:iam::123456789012:role/ExecutionRole"
153+
mock_result.config_path = tmp_path / ".bedrock_agentcore.yaml"
154+
mock_configure.return_value = mock_result
155+
156+
result = self.runner.invoke(
157+
app,
158+
[
159+
"configure",
160+
"--entrypoint",
161+
str(agent_file),
162+
"--execution-role",
163+
"ExecutionRole",
164+
"--code-build-execution-role",
165+
"CodeBuildRole",
166+
],
167+
)
168+
169+
assert result.exit_code == 0
170+
# Verify CodeBuild execution role was passed
171+
call_args = mock_configure.call_args
172+
assert call_args[1]["code_build_execution_role"] == "CodeBuildRole"
173+
129174
def test_configure_with_invalid_protocol(self, tmp_path):
130175
agent_file = tmp_path / "test_agent.py"
131176

tests/notebook/runtime/test_bedrock_agentcore.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,33 @@ def test_configure_with_requirements_generation(self, tmp_path):
8383
assert "boto3" in content
8484
assert "pandas" in content
8585

86+
def test_configure_with_code_build_execution_role(self, tmp_path):
87+
"""Test configuration with CodeBuild execution role."""
88+
agent_file = tmp_path / "test_agent.py"
89+
agent_file.write_text("from bedrock_agentcore.runtime import BedrockAgentCoreApp\napp = BedrockAgentCoreApp()")
90+
91+
bedrock_agentcore = Runtime()
92+
93+
with (
94+
patch(
95+
"bedrock_agentcore_starter_toolkit.notebook.runtime.bedrock_agentcore.configure_bedrock_agentcore"
96+
) as mock_configure,
97+
):
98+
mock_result = Mock()
99+
mock_result.config_path = tmp_path / ".bedrock_agentcore.yaml"
100+
mock_configure.return_value = mock_result
101+
102+
bedrock_agentcore.configure(
103+
entrypoint=str(agent_file),
104+
execution_role="ExecutionRole",
105+
code_build_execution_role="CodeBuildRole",
106+
)
107+
108+
# Verify configure was called with CodeBuild execution role
109+
mock_configure.assert_called_once()
110+
args, kwargs = mock_configure.call_args
111+
assert kwargs["code_build_execution_role"] == "CodeBuildRole"
112+
86113
def test_launch_without_config(self):
87114
"""Test launch fails when not configured."""
88115
bedrock_agentcore = Runtime()

0 commit comments

Comments
 (0)