Skip to content

Commit 77acebe

Browse files
authored
chore: make agentless_monitored_accounts optional (#1455)
* chore: make agentless_monitored_account optional * chore: fix make lint * chore: fix integration test
1 parent cbbcb1f commit 77acebe

File tree

3 files changed

+59
-25
lines changed

3 files changed

+59
-25
lines changed

cli/cmd/generate_aws.go

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,8 @@ var (
4444
QuestionAgentlessMonitoredAccountIDsHelp = "Please provide a comma seprated list that may " +
4545
"contain account IDs, OUs, or the organization root (e.g. 123456789000,ou-abcd-12345678,r-abcd)."
4646

47-
QuestionAgentlessMonitoredAccountProfile = "Monitored AWS account profile:"
48-
QuestionAgentlessMonitoredAccountRegion = "Monitored AWS account region:"
49-
QuestionAgentlessMonitoredAccountAddMore = "Add another monitored AWS account?"
50-
QuestionAgentlessMonitoredAccountsReplace = "Currently configured monitored accounts: %s, replace?"
47+
QuestionAgentlessMonitoredAccountProfile = "Monitored AWS account profile:"
48+
QuestionAgentlessMonitoredAccountRegion = "Monitored AWS account region:"
5149

5250
// Config questions
5351
QuestionEnableConfig = "Enable configuration integration?"
@@ -776,17 +774,48 @@ func promptAgentlessQuestions(config *aws.GenerateAwsTfConfigurationArgs) error
776774
}
777775

778776
config.AgentlessMonitoredAccountIDs = strings.Split(monitoredAccountIDListInput, ",")
777+
config.AgentlessMonitoredAccounts = []aws.AwsSubAccount{}
779778

780-
if err := promptAwsAccountsQuestions(
781-
&config.AgentlessMonitoredAccounts,
782-
IconAgentless,
783-
QuestionAgentlessMonitoredAccountProfile,
784-
QuestionAgentlessMonitoredAccountRegion,
785-
QuestionAgentlessMonitoredAccountAddMore,
786-
QuestionAgentlessMonitoredAccountsReplace,
787-
false,
788-
); err != nil {
789-
return err
779+
// Prompt user to enter profile/region for single accounts
780+
for _, accountID := range config.AgentlessMonitoredAccountIDs {
781+
err := validateAwsAccountID(accountID)
782+
if err != nil {
783+
continue
784+
}
785+
var profile, region string
786+
profileMessage := fmt.Sprintf(
787+
"%s for account %s:",
788+
QuestionAgentlessMonitoredAccountProfile[:len(QuestionAgentlessMonitoredAccountProfile)-1],
789+
accountID,
790+
)
791+
regionMessage := fmt.Sprintf(
792+
"%s for account %s:",
793+
QuestionAgentlessMonitoredAccountRegion[:len(QuestionAgentlessMonitoredAccountRegion)-1],
794+
accountID,
795+
)
796+
if err := SurveyMultipleQuestionWithValidation([]SurveyQuestionWithValidationArgs{
797+
{
798+
Icon: IconAgentless,
799+
Prompt: &survey.Input{Message: profileMessage},
800+
Opts: []survey.AskOpt{survey.WithValidator(validateAwsProfile)},
801+
Required: true,
802+
Response: &profile,
803+
},
804+
{
805+
Icon: IconAgentless,
806+
Prompt: &survey.Input{Message: regionMessage},
807+
Opts: []survey.AskOpt{survey.WithValidator(validateAwsRegion)},
808+
Required: true,
809+
Response: &region,
810+
},
811+
}); err != nil {
812+
return err
813+
}
814+
alias := fmt.Sprintf("%s-%s", profile, region)
815+
config.AgentlessMonitoredAccounts = append(
816+
config.AgentlessMonitoredAccounts,
817+
aws.AwsSubAccount{AwsProfile: profile, AwsRegion: region, Alias: alias},
818+
)
790819
}
791820
}
792821

integration/aws_generation_test.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func TestGenerationAwsNoninteractive(t *testing.T) {
7070
"--agentless_monitored_account_ids",
7171
"123456789000,ou-abcd-12345678,r-abcd",
7272
"--agentless_monitored_accounts",
73-
"monitored-1:us-west-1,monitored-2:us-west-2",
73+
"monitored-1:us-west-1",
7474
"--agentless_scanning_accounts",
7575
"scanning-1:us-east-1,scanning-2:us-east-2",
7676
"--config_lacework_account",
@@ -138,7 +138,6 @@ func TestGenerationAwsNoninteractive(t *testing.T) {
138138
aws.WithAgentlessMonitoredAccountIDs([]string{"123456789000", "ou-abcd-12345678", "r-abcd"}),
139139
aws.WithAgentlessMonitoredAccounts(
140140
aws.NewAwsSubAccount("monitored-1", "us-west-1", "monitored-1-us-west-1"),
141-
aws.NewAwsSubAccount("monitored-2", "us-west-2", "monitored-2-us-west-2"),
142141
),
143142
aws.WithAgentlessScanningAccounts(
144143
aws.NewAwsSubAccount("scanning-1", "us-east-1", "scanning-1-us-east-1"),
@@ -224,6 +223,9 @@ func TestGenerationAwsAgentlessOrganization(t *testing.T) {
224223
defer os.Setenv("LW_NOCACHE", "")
225224
var final string
226225

226+
monitoredProfileQuestion := "Monitored AWS account profile for account 123456789000"
227+
monitoredRegionQuestion := "Monitored AWS account region for account 123456789000"
228+
227229
// Run CLI
228230
tfResult := runGenerateTest(t,
229231
func(c *expect.Console) {
@@ -234,12 +236,8 @@ func TestGenerationAwsAgentlessOrganization(t *testing.T) {
234236
MsgRsp{cmd.QuestionEnableAgentless, "y"},
235237
MsgRsp{cmd.QuestionAgentlessManagementAccountID, "123456789000"},
236238
MsgRsp{cmd.QuestionAgentlessMonitoredAccountIDs, "123456789000,ou-abcd-12345678,r-abcd"},
237-
MsgRsp{cmd.QuestionAgentlessMonitoredAccountProfile, "monitored-1"},
238-
MsgRsp{cmd.QuestionAgentlessMonitoredAccountRegion, "us-west-1"},
239-
MsgRsp{cmd.QuestionAgentlessMonitoredAccountAddMore, "y"},
240-
MsgRsp{cmd.QuestionAgentlessMonitoredAccountProfile, "monitored-2"},
241-
MsgRsp{cmd.QuestionAgentlessMonitoredAccountRegion, "us-west-2"},
242-
MsgRsp{cmd.QuestionAgentlessMonitoredAccountAddMore, "n"},
239+
MsgRsp{monitoredProfileQuestion, "monitored-1"},
240+
MsgRsp{monitoredRegionQuestion, "us-west-1"},
243241
MsgRsp{cmd.QuestionAgentlessScanningAccountProfile, "scanning-1"},
244242
MsgRsp{cmd.QuestionAgentlessScanningAccountRegion, "us-east-1"},
245243
MsgRsp{cmd.QuestionAgentlessScanningAccountAddMore, "y"},
@@ -269,7 +267,6 @@ func TestGenerationAwsAgentlessOrganization(t *testing.T) {
269267
aws.WithAgentlessMonitoredAccountIDs([]string{"123456789000", "ou-abcd-12345678", "r-abcd"}),
270268
aws.WithAgentlessMonitoredAccounts(
271269
aws.NewAwsSubAccount("monitored-1", "us-west-1", "monitored-1-us-west-1"),
272-
aws.NewAwsSubAccount("monitored-2", "us-west-2", "monitored-2-us-west-2"),
273270
),
274271
aws.WithAgentlessScanningAccounts(
275272
aws.NewAwsSubAccount("scanning-1", "us-east-1", "scanning-1-us-east-1"),

lwgenerate/aws/aws.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package aws
44
import (
55
"encoding/json"
66
"fmt"
7+
"regexp"
78
"slices"
89
"strings"
910

@@ -309,7 +310,14 @@ func (args *GenerateAwsTfConfigurationArgs) Validate() error {
309310
return errors.New("must specify monitored account ID list for Agentless organization integration")
310311
}
311312
if len(args.AgentlessMonitoredAccounts) == 0 {
312-
return errors.New("must specify monitored accounts for Agentless organization integration")
313+
// profile/region is required for single accounts
314+
for _, accountID := range args.AgentlessMonitoredAccountIDs {
315+
regex, _ := regexp.Compile(`^\d{12}$`)
316+
if regex.MatchString(accountID) {
317+
return errors.New("must specify profile/region for single monitored accounts" +
318+
" for Agentless organization integration")
319+
}
320+
}
313321
}
314322
if len(args.AgentlessScanningAccounts) == 0 {
315323
return errors.New("must specify scanning accounts for Agentless organization integration")
@@ -1111,7 +1119,7 @@ func createAgentless(args *GenerateAwsTfConfigurationArgs) ([]*hclwrite.Block, e
11111119
// Get OU IDs for the organizational_unit_ids attribute
11121120
OUIDs := []string{}
11131121
for _, accountID := range args.AgentlessMonitoredAccountIDs {
1114-
if strings.HasPrefix(accountID, "ou-") {
1122+
if strings.HasPrefix(accountID, "ou-") || strings.HasPrefix(accountID, "r-") {
11151123
OUIDs = append(OUIDs, fmt.Sprintf("\"%s\"", accountID))
11161124
}
11171125
}

0 commit comments

Comments
 (0)