Skip to main content
Version: v1.7.0

AWS

Please check the general requirements for basic requirements. On this page, we include AWS-specific recommendations.

Setting up Domain Name

For a seamless integration experience, we recommend using AWS Route 53.

Configuring Network

Check the network and firewall requirements section from the general requirements.

Please follow AWS VPC creation guide to set up your VPC, subnets, security groups, etc.

Your subnets will need to have correct tags below in order to provision the load balancer for nginx ingress

  • common tag for both public subnets and private subnets: kubernetes.io/cluster/${cluster-name}: owned or shared
  • public subnets be tagged with: kubernetes.io/role/elb (for an internet-facing load balancer)
  • private subnets be tagged with: kubernetes.io/role/internal-elb (for an internal/private load balancer)

Please contact AlphaSense if you need extra annotations to the nginx ingress service kind specified in cloud-provider-aws

Kubernetes Cluster

CNI

We recommend using EKS default CNI or Cilium.

Amazon EBS Storage

Make sure the AWS EBS CSI driver is installed and working.

Node Groups Configuration

Select one of the reference architectures and configure the node group auto-scaling accordingly.

Required IMDSv2 nodegroup configurations

We haven't fully migrated all applications to IMDSv2.

All nodegroup will need below InstanceMetadataOptionsRequest:

HttpEndpoint: enabled
HttpPutResponseHopLimit: 2
HttpTokens: required

Above are also default configurations for EKS managed nodegroup. Ref:

Please use Ubuntu AMI and disable built-in nvidia-plugin for gpu nodegroup

We included NVIDIA GPU Operator to configure the driver for Ubuntu AMI kernel.

If you use eksctl to create the cluster, please add the flag --install-nvidia-plugin=false

eksctl cluster creation command
eksctl create cluster -f cluster.yaml --install-nvidia-plugin=false
Example of eksctl configuration that would set up the VPC, cluster, EBS CSI driver, OIDC, and needed role for Karpenter.

Please adapt the configuration to meet your security compliance.

eksctl configuration example cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: ${CLUSTER_NAME}
region: ${LOCATION}
version: '1.29'
tags:
karpenter.sh/discovery: ${CLUSTER_NAME}
iam:
withOIDC: true
vpcResourceControllerPolicy: true
karpenter:
version: '1.0.7' # Exact version must be provided
createServiceAccount: true
withSpotInterruptionQueue: false
vpc:
cidr: '172.16.0.0/16'
autoAllocateIPv6: false
clusterEndpoints:
publicAccess: true
nat:
gateway: HighlyAvailable
addons:
- name: vpc-cni
version: latest
- name: coredns
version: latest
- name: kube-proxy
version: latest
- name: aws-ebs-csi-driver
version: latest
managedNodeGroups: # this has needed imds v2 configurations by default
- name: bootstrap
instanceType: m6a.2xlarge
desiredCapacity: 2
minSize: 2
volumeEncrypted: true
volumeSize: 100
updateConfig:
maxUnavailable: 1
labels:
type: default
ssh:
allow: true
publicKeyName: <your public key name>
privateNetworking: true
iam:
withAddonPolicies:
externalDNS: true
certManager: true
ebs: true
fsx: false
efs: false
Example of a Karpenter nodepool and ec2nodeclass

Please add all needed nodepool and ec2nodeclass with the right labels and taints as specified above.

karpenter example provisioner
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: gpu-t4-xlarge
spec:
template:
metadata:
labels:
type: gpu
'gpu.type': T4
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ['on-demand']
- key: node.kubernetes.io/instance-type
operator: In
values: ['g4dn.xlarge']
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: gpu-t4-xlarge
expireAfter: 720h # 30d * 24h = 720h
limits:
cpu: 1000
nvidia.com/gpu: 6
disruption:
consolidationPolicy: WhenEmptyOrUnderutilized
consolidateAfter: 15m
---
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: gpu-t4-xlarge
spec:
metadataOptions: # required imds v2 configurations
httpEndpoint: enabled
httpPutResponseHopLimit: 2
httpTokens: required
amiFamily: AL2 # for userData template, ref: https://karpenter.sh/v1.0/concepts/nodeclasses/#specamifamily
instanceProfile: 'eksctl-KarpenterNodeInstanceProfile-${CLUSTER_NAME}'
blockDeviceMappings:
- deviceName: /dev/sda1
ebs:
volumeSize: 100Gi
volumeType: gp3
encrypted: true
rootVolume: true
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: '${CLUSTER_NAME}'
kubernetes.io/role/internal-elb: '1' # private subnets
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: '${CLUSTER_NAME}'
Name: eksctl-${CLUSTER_NAME}-cluster/ClusterSharedNodeSecurityGroup
amiSelectorTerms:
- name: ubuntu-eks/k8s_1.30/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-20240729
owner: '099720109477' # Canonical account id
tags:
Name: gpu-t4-xlarge-${CLUSTER_NAME}

S3 Buckets

AlphaSense uses Crossplane to create around 30 buckets. The AWS account where you plan to install must have enough free space to create those buckets.

MySQL Database Cluster

Please check the engine and required parameters in the MySQL database cluster section of the general requirements.

We recommend using Aurora MySQL.

If you use Aurora MySQL, please follow the parameter groups docs to configure the server parameters.

Example AWS CLI command to create the cluster parameter group
AWS RDS cluster parameter group
aws rds create-db-cluster-parameter-group --db-cluster-parameter-group-name "${CLUSTER_NAME}-cluster-parameter-group" --db-parameter-group-family aurora-mysql5.7 --description shared
aws rds modify-db-cluster-parameter-group --db-cluster-parameter-group-name "${CLUSTER_NAME}-cluster-parameter-group" --parameters \
ParameterName=wait_timeout,ParameterValue=1800,ApplyMethod=immediate \
ParameterName=connect_timeout,ParameterValue=20,ApplyMethod=immediate \
ParameterName=net_read_timeout,ParameterValue=60,ApplyMethod=immediate \
ParameterName=net_write_timeout,ParameterValue=120,ApplyMethod=immediate \
ParameterName=innodb_print_all_deadlocks,ParameterValue=1,ApplyMethod=immediate \
ParameterName=lower_case_table_names,ParameterValue=1,ApplyMethod=pending-reboot

IAM Roles for Service Accounts (IRSA)

We support only IRSA; no support for EKS Pod Identity.

Customers will need to set up an OIDC provider and the required IAM roles and policies for Crossplane controller pods. AlphaSense provides Crossplane controllers in the installation manifests which will assume the customer-provided role to create pods' IRSA, SNS, SQS, S3, and DynamoDB as detailed below.

AWS IAM Role & Policy Setup

export AWS variables
export AWS_PROFILE=<aws profile where you want to install the AlphaSense EI product>
export CLUSTER_NAME=<your cluster name, e.g. thunderstorm>
export ACCOUNT_ID=<aws account id, i.e: 683356991689>
export OIDC_ID=<OIDC id, i.e: oidc.eks.us-east-1.amazonaws.com/id/7B05FD51D86B2B7249D2A21521E477EE>

Establish one essential role for Crossplane to provision AWS cloud resources.

OIDC Provider for IAM Role for Service Account

Please follow the guide to create an OIDC provider and associate it with the Kubernetes cluster.

Make sure the OIDC provider has these audiences:

  • amazonaws.com
  • sts.amazonaws.com

AWS OIDC Audiences

Note down the OIDC ID. For example: oidc.eks.us-east-1.amazonaws.com/id/7B05FD51D86B2B7249D2A21521E477EE.

warning

Please input the exact OIDC ID during the installation.

The OIDC ID must look like oidc.eks.us-east-1.amazonaws.com/id/7B05FD51D86B2B7249D2A21521E477EE, for example.

Please do not include the https:// prefix.

Crossplane Managed Identity

Note

To enable Crossplane to create all the necessary resources and permissions, a role must be created. The following examples and lists are provided for audit purposes. You can decide how to create the role and identity, whether through Terraform or another method of your choice.

Remember to replace placeholders in commands with your actual information during execution.

crossplane_role_trust.json
cat << 'EOF' > crossplane_role_trust.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${ACCOUNT_ID}:oidc-provider/${OIDC_ID}"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringLike": {
"${OIDC_ID}:sub": "system:serviceaccount:crossplane:aws-*"
}
}
}
]
}
EOF

The crossplane_role_trust.json file defines the trust relationship policy for the Crossplane IAM role. This policy specifies which entities are allowed to assume the role and under what conditions.

In this case, the policy allows the role to be assumed by a federated identity from the specified OIDC provider.

The Condition section further restricts the assumption of the role to service accounts within the crossplane namespace that match the pattern aws-*.

crossplane_boundary.json
cat << 'EOF' > crossplane_boundary.json
{
"Statement": [
{
"Effect": "Allow",
"NotAction": [
"support:*",
"organizations:*",
"iam:Upload*",
"iam:Update*",
"iam:Untag*",
"iam:Tag*",
"iam:Set*",
"iam:Resync*",
"iam:Reset*",
"iam:Remove*",
"iam:Put*",
"iam:PassRole",
"iam:ListVirtualMFA*",
"iam:ListMFA*",
"iam:GetOrganizationsAccessReport",
"iam:GetAccountAuthorizationDetails",
"iam:Generate*",
"iam:Enable*",
"iam:Detach*",
"iam:Delete*",
"iam:Deactivate*",
"iam:Create*",
"iam:Change*",
"iam:Attach*",
"iam:Add*",
"cloudtrail:DeleteTrail"
],
"Resource": "*",
"Sid": "AllowAllActionsApartFromListed"
}
],
"Version": "2012-10-17"
}
EOF

The crossplane_boundary.json file defines a permissions boundary for the IAM roles for service accounts (IRSA) created by Crossplane. Each application pod will have an IRSA with fine-grain access control, allowing the application to access only the resources it needs. This boundary prevents the application from using high privilege IAM permissions by denying the actions explicitly listed in the NotAction section.

The table below explains the permissions granted in crossplane_boundary.json
PermissionDescription
support:*Denied. Prevents any support-related actions.
organizations:*Denied. Prevents any actions related to AWS Organizations.
iam:Upload*Denied. Prevents uploading any IAM resources.
iam:Update*Denied. Prevents updating any IAM resources.
iam:Untag*Denied. Prevents removing tags from IAM resources.
iam:Tag*Denied. Prevents adding tags to IAM resources.
iam:Set*Denied. Prevents setting any IAM configurations.
iam:Resync*Denied. Prevents resynchronizing IAM resources.
iam:Reset*Denied. Prevents resetting any IAM configurations.
iam:Remove*Denied. Prevents removing any IAM resources.
iam:Put*Denied. Prevents putting any IAM configurations.
iam:PassRoleDenied. Prevents passing any IAM roles.
iam:ListVirtualMFA*Denied. Prevents listing virtual MFA devices.
iam:ListMFA*Denied. Prevents listing MFA devices.
iam:GetOrganizationsAccessReportDenied. Prevents getting access reports for organizations.
iam:GetAccountAuthorizationDetailsDenied. Prevents getting account authorization details.
iam:Generate*Denied. Prevents generating any IAM resources.
iam:Enable*Denied. Prevents enabling any IAM configurations.
iam:Detach*Denied. Prevents detaching any IAM policies.
iam:Delete*Denied. Prevents deleting any IAM resources.
iam:Deactivate*Denied. Prevents deactivating any IAM configurations.
iam:Create*Denied. Prevents creating any IAM resources.
iam:Change*Denied. Prevents changing any IAM configurations.
iam:Attach*Denied. Prevents attaching any IAM policies.
iam:Add*Denied. Prevents adding any IAM resources.
cloudtrail:DeleteTrailDenied. Prevents deleting CloudTrail trails.
crossplane.json
cat << 'EOF' > crossplane.json
{
"Statement": [
{
"Action": [
"iam:Update*",
"iam:Put*",
"iam:DetachRolePolicy",
"iam:DeleteRolePolicy",
"iam:AttachRolePolicy"
],
"Effect": "Deny",
"Resource": "arn:aws:iam::${ACCOUNT_ID}:role/web-identity/${CLUSTER_NAME}/crossplane-provider-${CLUSTER_NAME}",
"Sid": "DenyAlteringOwnRole"
},
{
"Action": [
"iam:SetDefaultPolicyVersion",
"iam:DeletePolicyVersion",
"iam:DeletePolicy",
"iam:CreatePolicyVersion"
],
"Effect": "Deny",
"Resource": "arn:aws:iam::${ACCOUNT_ID}:policy/web-identity/${CLUSTER_NAME}/crossplane-provider-${CLUSTER_NAME}-boundary",
"Sid": "DenyAlteringPermissionsBoundary"
},
{
"Action": "iam:DeleteRolePermissionsBoundary",
"Effect": "Deny",
"Resource": "*",
"Sid": "DenyDeletingAnyPermissionsBoundary"
},
{
"Action": "sts:GetCallerIdentity",
"Effect": "Allow",
"Resource": "*",
"Sid": "AllowCallSTSToGetCurrentIdentity"
},
{
"Action": [
"iam:PutRolePolicy",
"iam:PutRolePermissionsBoundary",
"iam:DetachRolePolicy",
"iam:DeleteRolePolicy",
"iam:CreateRole",
"iam:AttachRolePolicy"
],
"Condition": {
"StringEquals": {
"iam:PermissionsBoundary": "arn:aws:iam::${ACCOUNT_ID}:policy/web-identity/${CLUSTER_NAME}/crossplane-provider-${CLUSTER_NAME}-boundary"
}
},
"Effect": "Allow",
"Resource": "arn:aws:iam::${ACCOUNT_ID}:role/web-identity/${CLUSTER_NAME}/crossplane/*",
"Sid": "EnforcePermissionBoundaryOnSpecificIAMActions"
},
{
"Action": [
"iam:List*",
"iam:GetRole*",
"iam:GetPolicy*"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "AllowReadnListAllIAMRolesAndPolicies"
},
{
"Action": [
"iam:UpdateRoleDescription",
"iam:UpdateRole",
"iam:UpdateAssumeRolePolicy",
"iam:UntagRole",
"iam:TagRole",
"iam:ListAttachedRolePolicies",
"iam:DeleteRole"
],
"Effect": "Allow",
"Resource": "arn:aws:iam::${ACCOUNT_ID}:role/web-identity/${CLUSTER_NAME}/crossplane/*",
"Sid": "AllowCertainIAMActionsWithManagedRoles"
},
{
"Action": [
"iam:UntagPolicy",
"iam:TagPolicy",
"iam:DeletePolicy*",
"iam:CreatePolicy*"
],
"Effect": "Allow",
"Resource": "arn:aws:iam::${ACCOUNT_ID}:policy/web-identity/${CLUSTER_NAME}/crossplane/*",
"Sid": "AllowCertainIAMActionsWithManagedPolicies"
},
{
"Action": [
"s3:ReplicateDelete",
"s3:PutStorageLensConfiguration",
"s3:PutReplicationConfiguration",
"s3:PutLifecycleConfiguration",
"s3:PutIntelligentTieringConfiguration",
"s3:PutEncryptionConfiguration",
"s3:PutBucket*",
"s3:PutAccelerateConfiguration",
"s3:List*",
"s3:Get*",
"s3:DeleteStorageLensConfiguration",
"s3:CreateBucket"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "AllowS3BucketCreation"
},
{
"Action": [
"dynamodb:UpdateTimeToLive",
"dynamodb:UpdateTable",
"dynamodb:UpdateGlobalTableSettings",
"dynamodb:UpdateGlobalTable",
"dynamodb:UpdateContinuousBackups",
"dynamodb:UntagResource",
"dynamodb:TagResource",
"dynamodb:ListTagsOfResource",
"dynamodb:ListTables",
"dynamodb:ListStreams",
"dynamodb:ListImports",
"dynamodb:ListGlobalTables",
"dynamodb:ListExports",
"dynamodb:ListContributorInsights",
"dynamodb:ListBackups",
"dynamodb:DescribeTimeToLive",
"dynamodb:DescribeTable",
"dynamodb:DescribeContinuousBackups",
"dynamodb:DeleteTable",
"dynamodb:CreateTable",
"dynamodb:CreateGlobalTable"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "AllowDynamoDB"
},
{
"Action": [
"sns:UntagResource",
"sns:Unsubscribe",
"sns:TagResource",
"sns:Subscribe",
"sns:SetTopicAttributes",
"sns:SetSubscriptionAttributes",
"sns:SetEndpointAttributes",
"sns:ListTopics",
"sns:ListTagsForResource",
"sns:ListSubscriptionsByTopic",
"sns:ListSubscriptions",
"sns:ListSMSSandboxPhoneNumbers",
"sns:ListPlatformApplications",
"sns:ListOriginationNumbers",
"sns:ListEndpointsByPlatformApplication",
"sns:GetTopicAttributes",
"sns:GetSubscriptionAttributes",
"sns:GetEndpointAttributes",
"sns:DeleteTopic",
"sns:DeleteEndpoint",
"sns:CreateTopic",
"sns:ConfirmSubscription"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "AllowSNS"
},
{
"Action": [
"sqs:UntagQueue",
"sqs:TagQueue",
"sqs:SetQueueAttributes",
"sqs:ReceiveMessage",
"sqs:ListQueues",
"sqs:ListQueueTags",
"sqs:ListDeadLetterSourceQueues",
"sqs:GetQueueUrl",
"sqs:GetQueueAttributes",
"sqs:DeleteQueue",
"sqs:CreateQueue"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "AllowSQS"
}
],
"Version": "2012-10-17"
}
EOF

The crossplane.json file defines a set of IAM policies that are applied to the Crossplane provider role. These policies specify which actions are allowed or denied for the role, ensuring that the role operates within the defined security boundaries.

The table below explains the permissions granted and denied in crossplane.json

DenyAlteringOwnRole

PermissionDescription
iam:Update*Denied. Prevents updating any IAM resources.
iam:Put*Denied. Prevents putting any IAM configurations.
iam:DetachRolePolicyDenied. Prevents detaching role policies.
iam:DeleteRolePolicyDenied. Prevents deleting role policies.
iam:AttachRolePolicyDenied. Prevents attaching role policies.

The above actions are denied for the resource arn:aws:iam::${ACCOUNT_ID}:role/web-identity/${CLUSTER_NAME}/crossplane-provider-${CLUSTER_NAME} to prevent altering its own role.

DenyAlteringPermissionsBoundary

PermissionDescription
iam:SetDefaultPolicyVersionDenied. Prevents setting the default policy version.
iam:DeletePolicyVersionDenied. Prevents deleting policy versions.
iam:DeletePolicyDenied. Prevents deleting policies.
iam:CreatePolicyVersionDenied. Prevents creating policy versions.

The above actions are denied for the resource arn:aws:iam::${ACCOUNT_ID}:policy/web-identity/${CLUSTER_NAME}/crossplane-provider-${CLUSTER_NAME}-boundary to prevent altering the permissions boundary.

DenyDeletingAnyPermissionsBoundary

PermissionDescription
iam:DeleteRolePermissionsBoundaryDenied. Prevents deleting any permissions boundary.

The above action is denied for all resources to prevent deleting any permissions boundary.

AllowCallSTSToGetCurrentIdentity

PermissionDescription
sts:GetCallerIdentityAllowed. Permits calling STS to get the current identity.

The above action is allowed for all resources to enable getting the current identity.

EnforcePermissionBoundaryOnSpecificIAMActions

PermissionDescription
iam:PutRolePolicyAllowed. Permits putting role policies.
iam:PutRolePermissionsBoundaryAllowed. Permits putting role permissions boundaries.
iam:DetachRolePolicyAllowed. Permits detaching role policies.
iam:DeleteRolePolicyAllowed. Permits deleting role policies.
iam:CreateRoleAllowed. Permits creating roles.
iam:AttachRolePolicyAllowed. Permits attaching role policies.

The above actions are allowed for the resource arn:aws:iam::${ACCOUNT_ID}:role/web-identity/${CLUSTER_NAME}/crossplane/* with the condition that the permissions boundary is arn:aws:iam::${ACCOUNT_ID}:policy/web-identity/${CLUSTER_NAME}/crossplane-provider-${CLUSTER_NAME}-boundary.

AllowReadnListAllIAMRolesAndPolicies

PermissionDescription
iam:List*Allowed. Permits listing IAM resources.
iam:GetRole*Allowed. Permits getting role information.
iam:GetPolicy*Allowed. Permits getting policy information.

The above actions are allowed for all resources to enable reading and listing all IAM roles and policies.

AllowCertainIAMActionsWithManagedRoles

PermissionDescription
iam:UpdateRoleDescriptionAllowed. Permits updating role descriptions.
iam:UpdateRoleAllowed. Permits updating roles.
iam:UpdateAssumeRolePolicyAllowed. Permits updating assume role policies.
iam:UntagRoleAllowed. Permits removing tags from roles.
iam:TagRoleAllowed. Permits adding tags to roles.
iam:ListAttachedRolePoliciesAllowed. Permits listing attached role policies.
iam:DeleteRoleAllowed. Permits deleting roles.

The above actions are allowed for the resource arn:aws:iam::${ACCOUNT_ID}:role/web-identity/${CLUSTER_NAME}/crossplane/* to enable certain IAM actions with managed roles.

AllowCertainIAMActionsWithManagedPolicies

PermissionDescription
iam:UntagPolicyAllowed. Permits removing tags from policies.
iam:TagPolicyAllowed. Permits adding tags to policies.
iam:DeletePolicy*Allowed. Permits deleting policies.
iam:CreatePolicy*Allowed. Permits creating policies.

The above actions are allowed for the resource arn:aws:iam::${ACCOUNT_ID}:policy/web-identity/${CLUSTER_NAME}/crossplane/* to enable certain IAM actions with managed policies.

AllowS3BucketCreation

PermissionDescription
s3:ReplicateDeleteAllowed. Permits replicating delete markers.
s3:PutStorageLensConfigurationAllowed. Permits putting storage lens configurations.
s3:PutReplicationConfigurationAllowed. Permits putting replication configurations.
s3:PutLifecycleConfigurationAllowed. Permits putting lifecycle configurations.
s3:PutIntelligentTieringConfigurationAllowed. Permits putting intelligent tiering configurations.
s3:PutEncryptionConfigurationAllowed. Permits putting encryption configurations.
s3:PutBucket*Allowed. Permits putting bucket configurations.
s3:PutAccelerateConfigurationAllowed. Permits putting accelerate configurations.
s3:List*Allowed. Permits listing S3 resources.
s3:Get*Allowed. Permits getting S3 resources.
s3:DeleteStorageLensConfigurationAllowed. Permits deleting storage lens configurations.
s3:CreateBucketAllowed. Permits creating S3 buckets.

The above actions are allowed for all resources to enable S3 bucket creation, which is essential for the application to store and manage data.

AllowDynamoDB

PermissionDescription
dynamodb:UpdateTimeToLiveAllowed. Permits updating time to live settings.
dynamodb:UpdateTableAllowed. Permits updating tables.
dynamodb:UpdateGlobalTableSettingsAllowed. Permits updating global table settings.
dynamodb:UpdateGlobalTableAllowed. Permits updating global tables.
dynamodb:UpdateContinuousBackupsAllowed. Permits updating continuous backups.
dynamodb:UntagResourceAllowed. Permits removing tags from resources.
dynamodb:TagResourceAllowed. Permits adding tags to resources.
dynamodb:ListTagsOfResourceAllowed. Permits listing tags of resources.
dynamodb:ListTablesAllowed. Permits listing tables.
dynamodb:ListStreamsAllowed. Permits listing streams.
dynamodb:ListImportsAllowed. Permits listing imports.
dynamodb:ListGlobalTablesAllowed. Permits listing global tables.
dynamodb:ListExportsAllowed. Permits listing exports.
dynamodb:ListContributorInsightsAllowed. Permits listing contributor insights.
dynamodb:ListBackupsAllowed. Permits listing backups.
dynamodb:DescribeTimeToLiveAllowed. Permits describing time to live settings.
dynamodb:DescribeTableAllowed. Permits describing tables.
dynamodb:DescribeContinuousBackupsAllowed. Permits describing continuous backups.
dynamodb:DeleteTableAllowed. Permits deleting tables.
dynamodb:CreateTableAllowed. Permits creating tables.
dynamodb:CreateGlobalTableAllowed. Permits creating global tables.

The above actions are allowed for all resources to enable DynamoDB operations, which are essential for the application to manage and store data.

AllowSNS and AllowSQS

Our application's services use SNS and SQS for messaging communication, e.g., document ingestion pipeline, indexing pipeline, etc. Crossplane needs permissions to create and configure SQS and SNS resources for our services.

PermissionDescription
sns:UntagResourceAllowed. Permits removing tags from SNS resources.
sns:UnsubscribeAllowed. Permits unsubscribing from SNS topics.
sns:TagResourceAllowed. Permits adding tags to SNS resources.
sns:SubscribeAllowed. Permits subscribing to SNS topics.
sns:SetTopicAttributesAllowed. Permits setting SNS topic attributes.
sns:SetSubscriptionAttributesAllowed. Permits setting SNS subscription attributes.
sns:SetEndpointAttributesAllowed. Permits setting SNS endpoint attributes.
sns:ListTopicsAllowed. Permits listing SNS topics.
sns:ListTagsForResourceAllowed. Permits listing tags for SNS resources.
sns:ListSubscriptionsByTopicAllowed. Permits listing subscriptions by SNS topic.
sns:ListSubscriptionsAllowed. Permits listing SNS subscriptions.
sns:ListSMSSandboxPhoneNumbersAllowed. Permits listing SMS sandbox phone numbers.
sns:ListPlatformApplicationsAllowed. Permits listing SNS platform applications.
sns:ListOriginationNumbersAllowed. Permits listing origination numbers.
sns:ListEndpointsByPlatformApplicationAllowed. Permits listing endpoints by platform application.
sns:GetTopicAttributesAllowed. Permits getting SNS topic attributes.
sns:GetSubscriptionAttributesAllowed. Permits getting SNS subscription attributes.
sns:GetEndpointAttributesAllowed. Permits getting SNS endpoint attributes.
sns:DeleteTopicAllowed. Permits deleting SNS topics.
sns:DeleteEndpointAllowed. Permits deleting SNS endpoints.
sns:CreateTopicAllowed. Permits creating SNS topics.
sns:ConfirmSubscriptionAllowed. Permits confirming SNS subscriptions.
sqs:UntagQueueAllowed. Permits removing tags from SQS queues.
sqs:TagQueueAllowed. Permits adding tags to SQS queues.
sqs:SetQueueAttributesAllowed. Permits setting SQS queue attributes.
sqs:ReceiveMessageAllowed. Permits receiving messages from SQS queues.
sqs:ListQueuesAllowed. Permits listing SQS queues.
sqs:ListQueueTagsAllowed. Permits listing tags for SQS queues.
sqs:ListDeadLetterSourceQueuesAllowed. Permits listing dead letter source queues.
sqs:GetQueueUrlAllowed. Permits getting the URL of SQS queues.
sqs:GetQueueAttributesAllowed. Permits getting attributes of SQS queues.
sqs:DeleteQueueAllowed. Permits deleting SQS queues.
sqs:CreateQueueAllowed. Permits creating SQS queues.

The above actions are allowed for all resources to enable SNS and SQS operations, which are essential for the application to exchange data between services.

crossplane provider IAM role
aws iam create-policy --policy-name "crossplane-provider-${CLUSTER_NAME}-boundary" --path "/web-identity/${CLUSTER_NAME}/" --policy-document file://crossplane_boundary.json && \
aws iam create-policy --policy-name "crossplane-provider-${CLUSTER_NAME}-policy" --path "/web-identity/${CLUSTER_NAME}/" --policy-document "$(< crossplane.json envsubst)" && \
aws iam create-role --role-name "crossplane-provider-${CLUSTER_NAME}" --path "/web-identity/${CLUSTER_NAME}/" --assume-role-policy-document "$(< crossplane_role_trust.json envsubst)"
aws iam attach-role-policy --role-name "crossplane-provider-${CLUSTER_NAME}" --policy-arn "arn:aws:iam::${ACCOUNT_ID}:policy/web-identity/${CLUSTER_NAME}/crossplane-provider-${CLUSTER_NAME}-policy"
warning

Do not attach crossplane-provider-${CLUSTER_NAME}-boundary to any IAM role manually. It will be attached automatically by Crossplane to the IRSA roles.

Configuration for Amazon Bedrock

The prerequisites for using Anthropic via Bedrock are detailed in the AWS documentation. There are just a few quick manual steps:

  1. On the Model access page, select Manage model access. You will then click the Submit use case details button next to the Anthropic models. Configuration for Amazon Bedrock - Step 1
  2. To submit use case details, you should enter the Company Name and URL. We recommend using the following answers: Configuration for Amazon Bedrock - Step 2
  • What industry do you operate in? Software as a Service
  • Who are your intended users? Internal Employees
  • Will you be using Anthropic models for any of the following purposes? None of the above
  • Describe your use cases: AlphaSense uses Anthropic for search summarization and assistant chat.
  1. Select all Anthropic models and click Request model access. Configuration for Amazon Bedrock - Step 3

This is the final step, you will see access granted for Anthropic models as confirmation. This will typically take about 5 to 10 minutes.

Kubernetes Secrets

Check the Kubernetes secrets section from the general requirements.

Telemetry

For auditing and troubleshooting purposes, you can use the built-in Grafana central hub to access the logs and metrics. Details can be found in Observability.