@@ -64,3 +64,83 @@ resource "aws_opensearchserverless_access_policy" "opensearch_serverless_data_ac
6464 }
6565 ])
6666}
67+
68+ // NOTE: Collection and dashboards are currently public (AllowFromPublic = true) for ease of testing.
69+ // To make the collection private later, create VPCE(s) in the account-wide stack and supply their IDs
70+ // to this stack, then set AllowFromPublic = false and set SourceVPCEs.
71+ // This should be done once a Lambda (or any other compute running inside a VPC) needs to read or write
72+ // indexes in the collection, so that access occurs over PrivateLink instead of the public endpoint.
73+
74+ resource "aws_opensearchserverless_security_policy" "opensearch_serverless_workspace_network_access_policy" {
75+ count = local. workspace_suffix == " " ? 0 : 1
76+ name = " ${ var . environment } -${ var . stack_name } ${ local . workspace_suffix } -nap"
77+ description = " Workspace-level network access for collection dashboards and collection endpoint"
78+ type = " network"
79+
80+ policy = jsonencode ([
81+ {
82+ Description = " Workspace dashboard access"
83+ AllowFromPublic = true
84+ Rules = [
85+ {
86+ Resource = [" collection/${ data . aws_opensearchserverless_collection . opensearch_serverless_collection . name } " ]
87+ ResourceType = " dashboard"
88+ }
89+ ]
90+ },
91+ {
92+ Description = " Workspace network access for collection"
93+ AllowFromPublic = true
94+ Rules = [
95+ {
96+ Resource = [" collection/${ data . aws_opensearchserverless_collection . opensearch_serverless_collection . name } " ]
97+ ResourceType = " collection"
98+ }
99+ ]
100+ }
101+ ])
102+ }
103+
104+ resource "aws_opensearchserverless_access_policy" "opensearch_serverless_workspace_data_access_policy" {
105+ count = local. workspace_suffix == " " ? 0 : 1
106+
107+ name = " ${ var . environment } -${ var . stack_name } ${ local . workspace_suffix } -dap"
108+ type = " data"
109+ description = " Collection-level data access policy for OpenSearch collection ${ data . aws_opensearchserverless_collection . opensearch_serverless_collection . name } (grants collection & index ops)"
110+
111+ policy = jsonencode ([
112+ {
113+ Rules = [
114+ {
115+ ResourceType = " collection"
116+ Resource = [" collection/${ data . aws_opensearchserverless_collection . opensearch_serverless_collection . name } " ]
117+ Permission = [
118+ " aoss:CreateCollectionItems" ,
119+ " aoss:UpdateCollectionItems" ,
120+ " aoss:DescribeCollectionItems" ,
121+ " aoss:DeleteCollectionItems"
122+ ]
123+ },
124+ {
125+ ResourceType = " index"
126+ Resource = [" index/${ data . aws_opensearchserverless_collection . opensearch_serverless_collection . name } /${ local . opensearch_index_name } " ]
127+ Permission = [
128+ " aoss:CreateIndex" ,
129+ " aoss:UpdateIndex" ,
130+ " aoss:DescribeIndex" ,
131+ " aoss:DeleteIndex" ,
132+ " aoss:ReadDocument" ,
133+ " aoss:WriteDocument"
134+ ]
135+ }
136+ ],
137+ Principal = concat (
138+ [
139+ data . aws_caller_identity . current . arn ,
140+ aws_iam_role . osis_pipelines_role . arn
141+ ],
142+ local. env_sso_roles
143+ )
144+ }
145+ ])
146+ }
0 commit comments