-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(aws): add aws lambdas and infra
- Loading branch information
1 parent
88f3093
commit 1790653
Showing
17 changed files
with
924 additions
and
50 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package main | ||
|
||
import ( | ||
"context" | ||
"net/http" | ||
|
||
"github.com/aws/aws-lambda-go/lambda" | ||
"github.com/awslabs/aws-lambda-go-api-proxy/httpadapter" | ||
"github.com/storacha/indexing-service/pkg/aws" | ||
"github.com/storacha/indexing-service/pkg/server" | ||
) | ||
|
||
func main() { | ||
config := aws.FromEnv(context.Background()) | ||
service, err := aws.Construct(config) | ||
if err != nil { | ||
panic(err) | ||
} | ||
handler := server.GetClaimsHandler(service) | ||
lambda.Start(httpadapter.NewV2(http.HandlerFunc(handler)).ProxyWithContext) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package main | ||
|
||
import ( | ||
"context" | ||
"net/http" | ||
|
||
"github.com/aws/aws-lambda-go/lambda" | ||
"github.com/awslabs/aws-lambda-go-api-proxy/httpadapter" | ||
"github.com/storacha/indexing-service/pkg/aws" | ||
"github.com/storacha/indexing-service/pkg/server" | ||
) | ||
|
||
func main() { | ||
config := aws.FromEnv(context.Background()) | ||
handler := server.GetRootHandler(config.Signer) | ||
lambda.Start(httpadapter.NewV2(http.HandlerFunc(handler)).ProxyWithContext) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package main | ||
|
||
import ( | ||
"context" | ||
"time" | ||
|
||
"github.com/aws/aws-lambda-go/events" | ||
"github.com/aws/aws-lambda-go/lambda" | ||
logging "github.com/ipfs/go-log/v2" | ||
"github.com/storacha/indexing-service/pkg/aws" | ||
"github.com/storacha/indexing-service/pkg/service/providerindex/notifier" | ||
) | ||
|
||
var log = logging.Logger("lambda/notifier") | ||
|
||
func makeHandler(notifier *notifier.Notifier) func(ctx context.Context, event events.EventBridgeEvent) { | ||
return func(ctx context.Context, event events.EventBridgeEvent) { | ||
synced, ts, err := notifier.Update(ctx) | ||
if err != nil { | ||
log.Errorf("error during notifier sync head check: %s", err.Error()) | ||
return | ||
} | ||
if !synced { | ||
log.Warnf("remote IPNI subscriber did not sync for %s", time.Since(ts)) | ||
} | ||
} | ||
} | ||
|
||
func main() { | ||
config := aws.FromEnv(context.Background()) | ||
// setup IPNI | ||
// TODO: switch to double hashed client for reader privacy? | ||
headStore := aws.NewS3Store(config.Config, config.NotifierHeadBucket, "") | ||
notifier, err := notifier.NewNotifierWithStorage(config.IndexerURL, config.PrivateKey, headStore) | ||
if err != nil { | ||
panic(err) | ||
} | ||
sqsRemoteSyncNotifier := aws.NewSQSRemoteSyncNotifier(config.Config, config.NotifierTopicArn) | ||
notifier.Notify(sqsRemoteSyncNotifier.NotifyRemoteSync) | ||
|
||
lambda.Start(makeHandler(notifier)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package main | ||
|
||
import ( | ||
"context" | ||
"net/http" | ||
|
||
"github.com/aws/aws-lambda-go/lambda" | ||
"github.com/awslabs/aws-lambda-go-api-proxy/httpadapter" | ||
"github.com/storacha/indexing-service/pkg/aws" | ||
"github.com/storacha/indexing-service/pkg/server" | ||
) | ||
|
||
func main() { | ||
config := aws.FromEnv(context.Background()) | ||
service, err := aws.Construct(config) | ||
if err != nil { | ||
panic(err) | ||
} | ||
handler := server.PostClaimsHandler(config.Signer, service) | ||
lambda.Start(httpadapter.NewV2(http.HandlerFunc(handler)).ProxyWithContext) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
package main | ||
|
||
import ( | ||
"context" | ||
"errors" | ||
"sync" | ||
|
||
"github.com/aws/aws-lambda-go/events" | ||
"github.com/aws/aws-lambda-go/lambda" | ||
logging "github.com/ipfs/go-log/v2" | ||
goredis "github.com/redis/go-redis/v9" | ||
"github.com/storacha/indexing-service/pkg/aws" | ||
"github.com/storacha/indexing-service/pkg/redis" | ||
"github.com/storacha/indexing-service/pkg/service/providercacher" | ||
) | ||
|
||
var log = logging.Logger("lambda/providercache") | ||
|
||
func handleMessage(ctx context.Context, sqsCachingDecoder *aws.SQSCachingDecoder, providerCacher providercacher.ProviderCacher, msg events.SQSMessage) error { | ||
job, err := sqsCachingDecoder.DecodeMessage(ctx, msg.Body) | ||
if err != nil { | ||
return err | ||
} | ||
_, err = providerCacher.CacheProviderForIndexRecords(ctx, job.Provider, job.Index) | ||
if err != nil { | ||
return err | ||
} | ||
return nil | ||
} | ||
|
||
func makeHandler(sqsCachingDecoder *aws.SQSCachingDecoder, providerCacher providercacher.ProviderCacher) func(ctx context.Context, sqsEvent events.SQSEvent) error { | ||
return func(ctx context.Context, sqsEvent events.SQSEvent) error { | ||
// process messages in parallel | ||
results := make(chan error, len(sqsEvent.Records)) | ||
var wg sync.WaitGroup | ||
for _, msg := range sqsEvent.Records { | ||
wg.Add(1) | ||
go func(msg events.SQSMessage) { | ||
defer wg.Done() | ||
err := handleMessage(ctx, sqsCachingDecoder, providerCacher, msg) | ||
results <- err | ||
}(msg) | ||
} | ||
wg.Wait() | ||
// collect errors | ||
close(results) | ||
var err error | ||
for nextErr := range results { | ||
err = errors.Join(err, nextErr) | ||
} | ||
// return overall error | ||
if err != nil { | ||
return err | ||
} | ||
for _, msg := range sqsEvent.Records { | ||
err := sqsCachingDecoder.CleanupMessage(ctx, msg.Body) | ||
if err != nil { | ||
log.Warnf("unable to cleanup message fully: %s", err.Error()) | ||
} | ||
} | ||
return nil | ||
} | ||
} | ||
|
||
func main() { | ||
config := aws.FromEnv(context.Background()) | ||
providerRedis := goredis.NewClient(&config.ProvidersRedis) | ||
providerStore := redis.NewProviderStore(providerRedis) | ||
providerCacher := providercacher.NewSimpleProviderCacher(providerStore) | ||
sqsCachingDecoder := aws.NewSQSCachingDecoder(config.Config, config.CachingBucket) | ||
lambda.Start(makeHandler(sqsCachingDecoder, providerCacher)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
package main | ||
|
||
import ( | ||
"context" | ||
"encoding/json" | ||
|
||
"github.com/aws/aws-lambda-go/events" | ||
"github.com/aws/aws-lambda-go/lambda" | ||
"github.com/ipfs/go-cid" | ||
logging "github.com/ipfs/go-log/v2" | ||
cidlink "github.com/ipld/go-ipld-prime/linking/cid" | ||
goredis "github.com/redis/go-redis/v9" | ||
"github.com/storacha/indexing-service/pkg/aws" | ||
"github.com/storacha/indexing-service/pkg/redis" | ||
"github.com/storacha/indexing-service/pkg/service/providercacher" | ||
"github.com/storacha/indexing-service/pkg/service/providerindex" | ||
"github.com/storacha/indexing-service/pkg/service/providerindex/store" | ||
) | ||
|
||
var log = logging.Logger("lambda/providercache") | ||
|
||
func handleMessage(ctx context.Context, sqsCachingDecoder *aws.SQSCachingDecoder, providerCacher providercacher.ProviderCacher, msg events.SQSMessage) error { | ||
job, err := sqsCachingDecoder.DecodeMessage(ctx, msg.Body) | ||
if err != nil { | ||
return err | ||
} | ||
_, err = providerCacher.CacheProviderForIndexRecords(ctx, job.Provider, job.Index) | ||
if err != nil { | ||
return err | ||
} | ||
return nil | ||
} | ||
|
||
func makeHandler(remoteSyncer *providerindex.RemoteSyncer) func(ctx context.Context, snsEvent events.SNSEvent) error { | ||
return func(ctx context.Context, snsEvent events.SNSEvent) error { | ||
for _, record := range snsEvent.Records { | ||
snsRecord := record.SNS | ||
var snsRemoteSyncMessage aws.SNSRemoteSyncMessage | ||
err := json.Unmarshal([]byte(snsRecord.Message), &snsRemoteSyncMessage) | ||
if err != nil { | ||
return err | ||
} | ||
headCid, err := cid.Parse(snsRemoteSyncMessage.Head) | ||
if err != nil { | ||
return err | ||
} | ||
head := cidlink.Link{Cid: headCid} | ||
prevCid, err := cid.Parse(snsRemoteSyncMessage.Prev) | ||
if err != nil { | ||
return err | ||
} | ||
prev := cidlink.Link{Cid: prevCid} | ||
remoteSyncer.HandleRemoteSync(ctx, head, prev) | ||
} | ||
return nil | ||
} | ||
} | ||
|
||
func main() { | ||
cfg := aws.FromEnv(context.Background()) | ||
providerRedis := goredis.NewClient(&cfg.ProvidersRedis) | ||
providerStore := redis.NewProviderStore(providerRedis) | ||
ipniStore := aws.NewS3Store(cfg.Config, cfg.IPNIStoreBucket, cfg.IPNIStorePrefix) | ||
chunkLinksTable := aws.NewDynamoProviderContextTable(cfg.Config, cfg.ChunkLinksTableName) | ||
metadataTable := aws.NewDynamoProviderContextTable(cfg.Config, cfg.MetadataTableName) | ||
publisherStore := store.NewPublisherStore(ipniStore, chunkLinksTable, metadataTable) | ||
remoteSyncer := providerindex.NewRemoteSyncer(providerStore, publisherStore) | ||
lambda.Start(makeHandler(remoteSyncer)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.