export const meta = { title: `Overview`, description: `Use Amplify CLI to create and manage cloud-connected file & data storage for your app.` }; Amplify CLI's `storage` category enables you to create and manage cloud-connected file & data storage. Use the `storage` category when you need to store: 1. app content (images, audio, video etc.) in an public, protected or private storage bucket or 2. app data in a NoSQL database and access it with a REST API + Lambda ## Setup a new storage resource You can setup a new storage resource by running the following command: ```bash amplify add storage ``` Amplify allows you to either setup a app content storage (images, audio, video etc.) backed by Amazon S3 or a NoSQL database backed by Amazon DynamoDB. ### Adding S3 storage ```console ? Please select from one of the below mentioned services: > Content (Images, audio, video, etc.) NoSQL Database ? Please provide a friendly name for your resource that will be used to label this category in the project: > mystorage ? Please provide bucket name: > mybucket ``` Follow the prompts to provide your content storage's resource name. The storage resource created by Amplify CLI has retention enabled which prevents accidental deletion or loss of data. Hence, running `amplify remove storage` will not delete the storage resource and will need to be manually deleted on the AWS console. ### S3 Access permissions Next, configure the access permissions for your Amazon S3 bucket. If you haven't set up the `auth` category already, the Amplify CLI will guide you through a workflow to enable the auth category. ```console ? Restrict access by? > Auth/Guest Users Individual Groups Both Learn more ``` **NOTE:** Run `amplify update storage` to change the access permissions for your Amazon S3 bucket #### Auth/Guest Users access Select `Auth/Guest Users`, to scope permissions based on an individual user's authentication status. On the next question you'll be able to select if only authenticated users can access resources, or authenticated and guest users: ``` ? Who should have access: ❯ Auth users only Auth and guest users ``` Then you'll be prompted to set the access scopes for your authenticated and (if selected prior) unauthenticated users. ```console ? What kind of access do you want for Authenticated users? > ◉ create/update ◯ read ◯ delete ? What kind of access do you want for Guest users? ◯ create/update > ◉ read ◯ delete ``` Granting access to authenticated users will allow the specified CRUD operations on objects in the bucket starting with the prefix `/public/`, `/protected/{cognito:sub}/`, and `/private/{cognito:sub}/`. `{cognito:sub}` is the sub of the Cognito identity of the authenticated user. Granting access to guest users will allow the specified CRUD operations on objects in the bucket starting with the prefix `/public/`. #### Individual Group access Select `Individual Groups` to scope access permissions based on [Cognito User Groups](/cli/auth/groups) ```console ? Select groups: ◉ EMPLOYEE > ◉ MANAGER ``` Then select the CRUD operations you want to permit for each selected Cognito user group ```console ? What kind of access do you want for EMPLOYEE users? ◯ create/update > ◉ read ◯ delete ? What kind of access do you want for MANAGER users? ◉ create/update ◯ read > ◉ delete ``` > Note: CRUD operations selected here will apply to ALL objects in the bucket, not just objects under a particular prefix. > Note: If you combine `Auth/Guest user access` and `Individual Group access`, users who are members of a group will only be granted the permissions of the group, and not the authenticated user permissions. ### S3 Lambda trigger Lastly, you have the option of configuring a Lambda function that can execute in response to S3 events. ```console ? Do you want to add a Lambda Trigger for your S3 Bucket? (y/N) ``` Learn more about this workflow [here](/cli/usage/lambda-triggers#s3-lambda-triggers). That's it! Your content storage is set up! Head to the [library's storage docs](/lib/storage/getting-started) to integrate this newly created S3 bucket into your app. ### Adding a NoSQL database ```console ? Please select from one of the below mentioned services: > Content (Images, audio, video, etc.) NoSQL Database ? Please provide a friendly name for your resource that will be used to label this category in the project: > dynamo2e1dc4eb ? Please provide table name: > dynamo2e1dc4eb ``` Follow the prompts to provide your NoSQL Database's resource name. Next, you'll go through a table-creation wizard. First, you'll create the columns of your table: ```console You can now add columns to the table. ? What would you like to name this column: id ? Please choose the data type: string ? Would you like to add another column? Yes ``` Then, you'll need to specify your indexes. The concept behind "indexes", "partition key", "sort key" and "global secondary indexes" are explained in-depth [here](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey). ```console ? Please choose partition key for the table: id ? Do you want to add a sort key to your table? (y/N) ``` ```console ? Do you want to add a Lambda Trigger for your Table? (y/N) ``` If you want to configure a Lambda trigger for your Table, you'll have the option. Learn more about this workflow [here](/cli/usage/lambda-triggers#dynamodb-lambda-triggers). That's it! Your NoSQL Database is set up!