(aws-appsync): Need an option for passing a Service Role to AppSync GraphQL Lambda Data Source
- Dominant language
- TypeScript
- Stars
- 12.9k
- Forks
- 4.6k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 74
Description
I have a **GraphQL AppSync** and a **Lambda Function data source**.
I want to use **existing IAM Roles** as the data source **Service Role**.
Currently, there appears to be no way to specify the service role.
## I have this Typescript CDK Code:
```typescript
const figaroLambda = new NodejsFunction(this, 'FigaroLambda', {
memorySize: 1024,
timeout: cdk.Duration.seconds(5),
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'handler',
role: figaroLambdaRole,
entry: path.join(__dirname, `figaro/index.ts`),
vpc,
vpcSubnets,
securityGroups: [figaroLambdaSecurityGroup],
});
// https://docs.aws.amazon.com/cdk/api/latest/typescript/api/aws-appsync/graphqlapi.html#aws_appsync_GraphqlApi
// https://docs.aws.amazon.com/cdk/api/latest/typescript/api/aws-appsync/graphqlapiprops.html#aws_appsync_GraphqlApiProps
const api = new appsync.GraphqlApi(this, 'NeptuneGraphQLApi', {
schema: appsync.Schema.fromAsset('schema.graphql'),
authorizationConfig: {
defaultAuthorization: {
authorizationType: appsync.AuthorizationType.USER_POOL,
userPoolConfig: {
userPool: userPool,
},
}
},
})
// https://docs.aws.amazon.com/cdk/api/latest/typescript/api/aws-appsync/graphqlapibase.html#aws_appsync_GraphqlApiBase_addLambdaDataSource
api.addLambdaDataSource('LambdaDatasourceFigaro', figaroLambda);
```
## Which creates:
```yaml
NeptuneGraphQLApiLambdaDatasourceFigaroServiceRoleCCBC152B:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: appsync.amazonaws.com
Version: "2012-10-17"
NeptuneGraphQLApiLambdaDatasourceFigaroServiceRoleDefaultPolicyB39D9AB9:
Type: AWS::IAM::Policy
Properties:
PolicyDocument:
Statement:
- Action: lambda:InvokeFunction
Effect: Allow
Resource:
Fn::GetAtt:
- FigaroLambdaA18864CC
- Arn
Version: "2012-10-17"
PolicyName: NeptuneGraphQLApiLambdaDatasourceFigaroServiceRoleDefaultPolicyB39D9AB9
Roles:
- Ref: NeptuneGraphQLApiLambdaDatasourceFigaroServiceRoleCCBC152B
NeptuneGraphQLApiLambdaDatasourceFigaro8722E995:
Type: AWS::AppSync::DataSource
Properties:
ApiId:
Fn::GetAtt:
- NeptuneGraphQLApi8AAC1DF5
- ApiId
Name: LambdaDatasourceFigaro
Type: AWS_LAMBDA
LambdaConfig:
LambdaFunctionArn:
Fn::GetAtt:
- FigaroLambdaA18864CC
- Arn
ServiceRoleArn:
Fn::GetAtt:
- NeptuneGraphQLApiLambdaDatasourceFigaroServiceRoleCCBC152B
- Arn
```
## Need an option for passing a `ServiceRole` to `addLambdaDataSource`
Please consider this a feature request to update either [`addLambdaDataSource(id, lambdaFunction, options)`](https://docs.aws.amazon.com/cdk/api/latest/typescript/api/aws-appsync/graphqlapibase.html#aws_appsync_GraphqlApiBase_addLambdaDataSource) or [`DataSourceOptions`](https://docs.aws.amazon.com/cdk/api/latest/typescript/api/aws-appsync/datasourceoptions.html#aws_appsync_DataSourceOptions) to include an option for specifying a service role:
```typescript
addLambdaDataSource(
id: string,
lambdaFunction: IFunction,
serviceRole: IRole,
options?: DataSourceOptions
): LambdaDataSource;
```
---
This is a :rocket: Feature Request
Contributor guide
Research direction
Start with GraphqlApiBase.addLambdaDataSource(id, lambdaFunction, options) and DataSourceOptions, which are the entry points named in the issue. Trace how the Lambda data source creates its ServiceRoleArn and identify the existing role-handling patterns in this API. Done means callers can provide an existing IRole and the generated AppSync data source uses that role instead of creating a new one.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- aws, typescript
- Domain
- api, cloud
- Issue type
- Feature
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 45/100