Skip to content

Commit

Permalink
Merge branch 'stocaaro/client-schema/mis-build' into stocaaro/client-…
Browse files Browse the repository at this point in the history
…schema/main
  • Loading branch information
stocaaro committed Nov 13, 2024
2 parents fe6caeb + 29bfad7 commit 7a48cec
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 16 deletions.
7 changes: 7 additions & 0 deletions .changeset/rare-kiwis-live.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@aws-amplify/backend': patch
'@aws-amplify/backend-data': patch
'@aws-amplify/model-generator': patch
---

feat: Add mis build to S3 from the data construct factory
1 change: 1 addition & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions packages/backend-data/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
"@aws-amplify/backend-output-storage": "^1.1.3",
"@aws-amplify/backend-output-schemas": "^1.4.0",
"@aws-amplify/data-construct": "^1.10.1",
"@aws-amplify/plugin-types": "^1.4.0",
"@aws-amplify/data-schema-types": "^1.2.0"
"@aws-amplify/data-schema-types": "^1.2.0",
"@aws-amplify/graphql-generator": "^0.5.1",
"@aws-amplify/plugin-types": "^1.4.0"
}
}
29 changes: 22 additions & 7 deletions packages/backend-data/src/app_sync_policy_generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ export class AppSyncPolicyGenerator {
/**
* Initialize with the GraphqlAPI that the policies will be scoped to
*/
constructor(private readonly graphqlApi: IGraphqlApi) {
constructor(
private readonly graphqlApi: IGraphqlApi,
private readonly modelIntrospectionSchemaArn?: string
) {
this.stack = Stack.of(graphqlApi);
}
/**
Expand All @@ -29,13 +32,25 @@ export class AppSyncPolicyGenerator {
.map((action) => actionToTypeMap[action])
// convert Type to resourceName
.map((type) => [this.graphqlApi.arn, 'types', type, '*'].join('/'));
return new Policy(this.stack, `${this.policyPrefix}${this.policyCount++}`, {
statements: [

const statements = [
new PolicyStatement({
actions: ['appsync:GraphQL'],
resources,
}),
];

if (this.modelIntrospectionSchemaArn) {
statements.push(
new PolicyStatement({
actions: ['appsync:GraphQL'],
resources,
}),
],
actions: ['s3:GetObject'],
resources: [this.modelIntrospectionSchemaArn],
})
);
}

return new Policy(this.stack, `${this.policyPrefix}${this.policyCount++}`, {
statements,
});
}
}
Expand Down
53 changes: 52 additions & 1 deletion packages/backend-data/src/factory.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ const createConstructContainerWithUserPoolAuthRegistered = (
authenticatedUserIamRole: new Role(stack, 'testAuthRole', {
assumedBy: new ServicePrincipal('test.amazon.com'),
}),
identityPoolId: 'identityPoolId',
cfnResources: {
cfnUserPool: new CfnUserPool(stack, 'CfnUserPool', {}),
cfnUserPoolClient: new CfnUserPoolClient(stack, 'CfnUserPoolClient', {
Expand All @@ -101,6 +100,7 @@ const createConstructContainerWithUserPoolAuthRegistered = (
),
},
groups: {},
identityPoolId: 'identityPool',
},
}),
});
Expand Down Expand Up @@ -567,6 +567,23 @@ void describe('DataFactory', () => {
},
],
},
{
Action: 's3:GetObject',
Resource: {
'Fn::Join': [
'',
[
{
'Fn::GetAtt': [
'modelIntrospectionSchemaBucketF566B665',
'Arn',
],
},
'/modelIntrospectionSchema.json',
],
],
},
},
],
},
Roles: [
Expand Down Expand Up @@ -675,6 +692,23 @@ void describe('DataFactory', () => {
],
},
},
{
Action: 's3:GetObject',
Resource: {
'Fn::Join': [
'',
[
{
'Fn::GetAtt': [
'modelIntrospectionSchemaBucketF566B665',
'Arn',
],
},
'/modelIntrospectionSchema.json',
],
],
},
},
],
},
Roles: [
Expand All @@ -701,6 +735,23 @@ void describe('DataFactory', () => {
],
},
},
{
Action: 's3:GetObject',
Resource: {
'Fn::Join': [
'',
[
{
'Fn::GetAtt': [
'modelIntrospectionSchemaBucketF566B665',
'Arn',
],
},
'/modelIntrospectionSchema.json',
],
],
},
},
],
},
Roles: [
Expand Down
42 changes: 36 additions & 6 deletions packages/backend-data/src/factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
ConstructFactory,
ConstructFactoryGetInstanceProps,
GenerateContainerEntryProps,
ReferenceAuthResources,
ResourceProvider,
} from '@aws-amplify/plugin-types';
import {
Expand All @@ -17,6 +16,7 @@ import {
TranslationBehavior,
} from '@aws-amplify/data-construct';
import { GraphqlOutput } from '@aws-amplify/backend-output-schemas';
import { generateModelsSync } from '@aws-amplify/graphql-generator';
import * as path from 'path';
import { AmplifyDataError, DataProps } from './types.js';
import {
Expand Down Expand Up @@ -46,6 +46,10 @@ import {
FunctionSchemaAccess,
JsResolver,
} from '@aws-amplify/data-schema-types';
import { Bucket } from 'aws-cdk-lib/aws-s3';
import { BucketDeployment, Source } from 'aws-cdk-lib/aws-s3-deployment';

const modelIntrospectionSchemaKey = 'modelIntrospectionSchema.json';

/**
* Singleton factory for AmplifyGraphqlApi constructs that can be used in Amplify project files.
Expand Down Expand Up @@ -98,9 +102,9 @@ export class DataFactory implements ConstructFactory<AmplifyData> {
this.props,
buildConstructFactoryProvidedAuthConfig(
props.constructContainer
.getConstructFactory<
ResourceProvider<AuthResources | ReferenceAuthResources>
>('AuthResources')
.getConstructFactory<ResourceProvider<AuthResources>>(
'AuthResources'
)
?.getInstance(props)
),
props,
Expand Down Expand Up @@ -232,14 +236,21 @@ class DataGenerator implements ConstructContainerEntryGenerator {
...schemasLambdaFunctions,
});
let amplifyApi = undefined;
let modelIntrospectionSchema: string | undefined = undefined;

const isSandboxDeployment =
scope.node.tryGetContext(CDKContextKey.DEPLOYMENT_TYPE) === 'sandbox';

try {
const combinedSchema = combineCDKSchemas(amplifyGraphqlDefinitions);
modelIntrospectionSchema = generateModelsSync({
schema: combinedSchema.schema,
target: 'introspection',
})['model-introspection.json'];

amplifyApi = new AmplifyData(scope, this.name, {
apiName: this.name,
definition: combineCDKSchemas(amplifyGraphqlDefinitions),
definition: combinedSchema,
authorizationModes,
outputStorageStrategy: this.outputStorageStrategy,
functionNameMap,
Expand All @@ -264,6 +275,20 @@ class DataGenerator implements ConstructContainerEntryGenerator {
);
}

const modelIntrospectionSchemaBucket = new Bucket(
scope,
'modelIntrospectionSchemaBucket',
{ enforceSSL: true }
);
new BucketDeployment(scope, 'modelIntrospectionSchemaBucketDeployment', {
// See https://github.com/aws-amplify/amplify-category-api/pull/1939
memoryLimit: 1536,
destinationBucket: modelIntrospectionSchemaBucket,
sources: [
Source.data(modelIntrospectionSchemaKey, modelIntrospectionSchema),
],
});

Tags.of(amplifyApi).add(TagName.FRIENDLY_NAME, this.name);

/**;
Expand All @@ -280,10 +305,15 @@ class DataGenerator implements ConstructContainerEntryGenerator {
ssmEnvironmentEntriesGenerator.generateSsmEnvironmentEntries({
[`${this.name}_GRAPHQL_ENDPOINT`]:
amplifyApi.resources.cfnResources.cfnGraphqlApi.attrGraphQlUrl,
[`${this.name}_MODEL_INTROSPECTION_SCHEMA_BUCKET_NAME`]:
modelIntrospectionSchemaBucket.bucketName,
[`${this.name}_MODEL_INTROSPECTION_SCHEMA_KEY`]:
modelIntrospectionSchemaKey,
});

const policyGenerator = new AppSyncPolicyGenerator(
amplifyApi.resources.graphqlApi
amplifyApi.resources.graphqlApi,
`${modelIntrospectionSchemaBucket.bucketArn}/${modelIntrospectionSchemaKey}`
);

schemasFunctionSchemaAccess.forEach((accessDefinition) => {
Expand Down

0 comments on commit 7a48cec

Please sign in to comment.