Skip to content

feat!: fold access-api into upload-api - #194

Merged
travis merged 63 commits into
mainfrom
feat/dynamo-delegations-provisions
Jul 18, 2023
Merged

feat!: fold access-api into upload-api#194
travis merged 63 commits into
mainfrom
feat/dynamo-delegations-provisions

Conversation

@travis

@travis travis commented May 5, 2023

Copy link
Copy Markdown
Contributor

Get @web3-storage/access-api handlers running in the upload-api service.

This introduces two new DynamoDB tables to store "delegations" and "provisions". NB: I have a related PR in #200 that uses "consumers" and "subscriptions" tables rather than "provisions".

This also adds a new Lambda to handle the email verification flow - I've brought some HTML utilities over from @web3-storage/access-api for this purpose and wired the handlers up to the same path they were at in the old service /validate-email.

This is the part 2 of a larger project (started in storacha/w3up#790) to integrate the access service into the w3infra upload service, which will let us move operational details out of w3up, retire D1, consolidate our operations around AWS Lambdas, deprecate now-unused functionality like the voucher flows and generally streamline our UCAN handlers and the infrastructure that supports them.

TODO

@seed-deploy
seed-deploy Bot temporarily deployed to pr194 May 5, 2023 20:07 Inactive
@travis
travis marked this pull request as draft May 5, 2023 20:18
@travis
travis requested review from Gozala, alanshaw and vasco-santos May 5, 2023 20:18
@seed-deploy

seed-deploy Bot commented May 5, 2023

Copy link
Copy Markdown
View stack outputs
  • pr194-w3infra-CarparkStack

    Name Value
    BucketName carpark-pr194-0
    Region us-east-2
  • pr194-w3infra-SatnavStack

    Name Value
    BucketName satnav-pr194-0
    Region us-east-2
  • pr194-w3infra-UploadApiStack

    Name Value
    ApiEndpoint https://hp29y2yke9.execute-api.us-east-2.amazonaws.com
    CustomDomain https://pr194.up.web3.storage
  • pr194-w3infra-BusStack

  • pr194-w3infra-ReplicatorStack

  • pr194-w3infra-UcanInvocationStack

  • pr194-w3infra-UploadDbStack

@Gozala Gozala left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As a direct port of what we have in d1 this looks all right. That said, I think taking bit more time to avoid another migration down the line might be in our benefit, from that perspective I have following notes:

  • We need two tables as opposed to currently 1 provisions table, which

    That way when you first login web3.storage can delegate an account a subscription that account can later add a consumer (space) to.

    1. Tracks subscriptions as in provider <-> customer relationship which is where provider could impose any constraints it wishes on the customer.
    2. Tracks subscription consumer provider <-> consumer <-> subscription relationship.
  • We need to support different actors to perform following queries

    • provider:
      • find my customers (accounts that have subscriptions)
      • find my consumers (spaces subscribed)
      • cancel subscription
      • block customer
      • stats per customer / consumer / subscription
    • space
      • what are my providers / subscriptions
      • unsubscribe
      • stats / limits
    • customer (account)
      • cancel subscription
      • what are my subscriptions
      • stats per subscriptions
  • we need to make provider capable of imposing whatever constraints it wants on accounts.

    • I propose accomplishing this via additional order field with uniqueness constraint. This way provider can impose all the constraints it wants by encoding them into the field generation.
      • e.g. web3.storage can derive order from the account email address.
      • nft.storage could choose alternative that would fit it's goals.

Comment thread upload-api/access-types.ts Outdated
Comment thread upload-api/access-types.ts Outdated
Comment thread upload-api/access-types.ts Outdated
Comment thread upload-api/access-types.ts Outdated
Comment thread upload-api/types.ts Outdated
Comment thread upload-api/access-types.ts Outdated
Comment thread upload-api/buckets/delegations-store.js
Comment thread upload-api/tables/delegations.js Outdated
Comment thread upload-api/tables/index.js Outdated
Comment thread upload-api/tables/provisions.js Outdated
travis added 5 commits May 9, 2023 13:45
This is a first step toward storacha/w3up#711 as documented in https://github.com/web3-storage/w3up/pull/744/files?short_path=4e012d9#diff-4e012d97ece45b455806fabbe1f93ce11af56213b9137463a427e1c5d4d8bda6

This is an implementation spike of storing delegations in DynamoDB rather than D1.

Because we already use DynamoDB in the upload-api, it made sense to reuse the configuration and testing infrastructure we've already built there. I copied a number of interfaces from https://github.com/web3-storage/w3up/tree/main/packages/access-api to get this done, and will migrate back to them if that ends up making sense.

As this implies, the path forward for this is somewhat unclear and I need feedback and consensus from the team to keep this moving.

We have a couple options to move forward:

1) Port the code in this PR over to the `access-api` repository and run it inside a cloudflare worker. This will require us to port some of the configuration and testing utilities in this repository to that repository and will leave us with a situation where compute in Cloudflare is reading and writing to DynamoDB in AWS. It will also require us to change the S3 logic in this PR to operate against R2, but that may Just Work thanks to theoretical API compatibility.

This will also result in AWS-related logic being split between this repository and w3up, and we will probably want to extract common utilities to a separate package at some point in the future.

2) Port the delegations-related service endpoints in `w3up/access-api` over to this repository and get them running in an AWS Lambda. In this scenario we could either use S3 as implemented in this PR or continue to store delegations in R2.

This option would move us in the direction of abstracting all operational details out of the w3up repository, following the pattern already used by w3up's `upload-api` package, which is imported by `upload-api` in this package.

In this option I think it probably makes sense to migrate existing delegations from R2 to S3, but could be wrong on that front.

My conversations with @Bengo suggested that the team may be mostly aligned behind option (2), especially because it seems like it moves us in the direction of isolating operational details of our services to this repository and turning the w3ui `*-api` packages into abstract implementations of the service providers we implement.

Thoughts?
implement a test that represents my current best understanding of how provisions should work for now.
travis added a commit to storacha/w3up that referenced this pull request May 15, 2023
travis added a commit to storacha/w3up that referenced this pull request May 16, 2023
@Gozala doesn't like them and made a good argument against this here: storacha/w3infra#194 (comment)
@travis
travis force-pushed the feat/dynamo-delegations-provisions branch from 123137d to db9198c Compare May 16, 2023 20:25
travis added 2 commits May 16, 2023 15:29
- add necessary context to run new providers
- add validate-email GET and POST handlers as a new Lambda
@travis travis changed the title initial implementations of DynamoDB-based delegation and provision storage services feat!: fold access-api into upload-api May 17, 2023
@travis
travis requested a review from olizilla May 17, 2023 17:43
@seed-deploy
seed-deploy Bot temporarily deployed to pr194 June 16, 2023 00:51 Inactive
configured and paid for a month of MailSlurp so we can take it for a test drive
reviewed this PR and made a bunch of updates
@seed-deploy
seed-deploy Bot temporarily deployed to pr194 June 20, 2023 23:47 Inactive
@seed-deploy
seed-deploy Bot temporarily deployed to pr194 June 20, 2023 23:58 Inactive
they weren't being added because Lambda is a special snowflake
@seed-deploy
seed-deploy Bot temporarily deployed to pr194 June 21, 2023 00:48 Inactive
@travis
travis requested a review from vasco-santos June 21, 2023 00:55

@vasco-santos vasco-santos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@travis left new round of feedback. We are close, most comments relate to prepare ourselves better for the upcoming follow ups from this PR that were identified

Comment thread stacks/upload-api-stack.js Outdated
Comment thread test/helpers/up-client.js Outdated
Comment thread .env.tpl
Comment thread test/helpers/up-client.js Outdated
Comment thread upload-api/email.js
Comment thread upload-api/tables/subscription.js Outdated
Comment thread upload-api/test/helpers/context.js Outdated
Comment thread upload-api/test/helpers/resources.js Outdated
Comment thread upload-api/test/queries.test.js Outdated
Comment thread upload-api/types.ts Outdated
@seed-deploy

seed-deploy Bot commented Jun 26, 2023

Copy link
Copy Markdown
Stack outputs updated
  • pr194-w3infra-CarparkStack

    Name Value
    BucketName carpark-pr194-0
    Region us-east-2
  • pr194-w3infra-SatnavStack

    Name Value
    BucketName satnav-pr194-0
    Region us-east-2
  • pr194-w3infra-UploadApiStack

    Name Value
    ApiEndpoint https://uv7re3yazj.execute-api.us-east-2.amazonaws.com
    CustomDomain https://pr194.up.web3.storage
  • pr194-w3infra-BusStack

  • pr194-w3infra-ReplicatorStack

  • pr194-w3infra-UcanInvocationStack

  • pr194-w3infra-UploadDbStack

I'll reintroduce these in a separate branch

@vasco-santos vasco-santos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This LGTM! Thanks for the great work here @travis

As we talked, let's get the migration code here and tested in staging only next week. So that we don't have main branch blocked until then

Travis Vachon and others added 5 commits July 13, 2023 11:11
To run:

```
# first ensure you are logged in to wrangler with `wrangler login`
STAGE=pr194 npm run d1-dynamo-migration
```

---------

Co-authored-by: Irakli Gozalishvili <contact@gozala.io>
grab data from D1 and use it to verify that all the bits got moved
correctly

during the course of this I found a bug in the migration script - whew!
thanks for the suggestion @vasco-santos

also add a simple utility to list the emails of folks who have
registered for w3up
emails don't seem to be making it through within 30 seconds
Comment thread tools/d1-migration/add-to-dynamo.js
Comment on lines +27 to +48
* Abstraction layer to handle operations on Store Table.
*
* @param {string} region
* @param {string} tableName
* @param {object} [options]
* @param {string} [options.endpoint]
*/
export function createSubscriptionTable (region, tableName, options = {}) {
const dynamoDb = new DynamoDBClient({
region,
endpoint: options.endpoint,
})

return useSubscriptionTable(dynamoDb, tableName)
}

/**
* @param {DynamoDBClient} dynamoDb
* @param {string} tableName
* @returns {SubscriptionTable}
*/
export function useSubscriptionTable (dynamoDb, tableName) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not want to block this PR, but I still dislike amount of incidental complexity we have for every single table which I have described a solution for in another PR, that I think applies here just as well

storacha/w3filecoin-infra#26 (comment)

Perhaps we could remove some of this complexity later as a cleanup.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I hear you on the incidental complexity, but to be honest this boilerplate doesn't bother me much - having one initializer per table that takes a generic client and another that takes a set of options to set up a client in a default way feels pretty normal and good to me.

That said I'm definitely not opposed to putting together a cleaner/easier-to-use abstraction for this. From my read of the comment thread you linked, @vasco-santos identified some additional complexity that isn't accounted for by the solution you propose.

If you're up for it, I think it would be a good idea for you to do a quick spike (including integrating it into tests and other places where we use these initializers - migration scripts, etc) of what you're thinking on a single table and then have the three of us do a (high bandwidth maybe?) review of the solution to make sure it fits all our needs and is strictly better than what we have right now. I'd be more than happy to take that spike and run with it, updating our usage across the board. I'd also be down to do the spike, but would definitely need to sync with you and Vasco to summarize and dig into the thinking on this thread so far.

All that said, I appreciate you looking out for these abstractions! I'm adding yet another table so I do think investing in this will help us keep things readable and usable.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants