Я настраиваю AWS Cognito Identity Pool с использованием инфраструктуры severless и редактирую файл в конфигурации yml, чтобы добавить роль без проверки подлинности для пользователей для загрузки изображения в корзину s3.
КодРанее была развернута без указания роли без проверки подлинности, и развертывание прошло нормально и было стабильным.После того, как я начал искать способ управления разрешениями на доступ к корзине S3, я обнаружил, что единственный способ дать права на запись, но не чтение к корзине S3 - это указать ее в пользовательской политике, поэтому мне нужно добавитьроль без удостоверения в пуле удостоверений.Однако, когда я внедряю код, я получаю сообщение об ошибке:
Serverless Error ---------------------------------------
An error occurred: CognitoIdentityPoolRoles - Resource cannot be updated.
Мне удалось обойти проблему в среде разработки, но для этого потребовалось полностью удалить стек и восстановить его с нуля.
Я также не хочу входить и настраивать ресурсы вручную в консоли AWS, так как ресурсы должны управляться в облачной форме или в консоли, но выполнение этого в обоих направлениях приводит к хаосу.
Итак, на данный момент я вижу варианты удалить весь стек и перестроить его с новыми ролями или найти способ обновления с помощью облачной информации.
У кого-нибудь есть способ избежать первого варианта и разрешить мне обновлять стек без присоединения роли в консоли?
Соответствующий раздел serverless.yml находится ниже ...
Resources:
# The federated identity for our user pool to auth with
CognitoIdentityPool:
Type: AWS::Cognito::IdentityPool
Properties:
# Generate a name based on the stage
IdentityPoolName: ${self:custom.stage}MyIdentityPool
# Allow unathenticated users
AllowUnauthenticatedIdentities: true
# Link to our User Pool
CognitoIdentityProviders:
- ClientId:
Ref: CognitoUserPoolClient
ProviderName:
Fn::GetAtt: [ "CognitoUserPool", "ProviderName" ]
# IAM roles
CognitoIdentityPoolRoles:
Type: AWS::Cognito::IdentityPoolRoleAttachment
Properties:
IdentityPoolId:
Ref: CognitoIdentityPool
Roles:
authenticated:
Fn::GetAtt: [CognitoAuthRole, Arn]
# Next two lines are the 2 lines of code which break everything
unauthenticated:
Fn::GetAtt: [CognitoUnAuthRole, Arn]
# IAM role for UN-authenticated users
CognitoUnAuthRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Principal:
Federated: 'cognito-identity.amazonaws.com'
Action:
- 'sts:AssumeRoleWithWebIdentity'
Condition:
StringEquals:
'cognito-identity.amazonaws.com:aud':
Ref: CognitoIdentityPool
'ForAnyValue:StringLike':
'cognito-identity.amazonaws.com:amr': unauthenticated
Policies:
- PolicyName: 'CognitoUnAuthorizedPolicy'
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Action:
- 'mobileanalytics:PutEvents'
- 'cognito-sync:*'
- 'cognito-identity:*'
Resource: '*'
# Allow users to upload attachments to their
# folder inside our S3 bucket
- Effect: 'Allow'
Action:
- 's3:PutObject'
Resource:
- Fn::Join:
- ''
-
- Fn::GetAtt: [MediafilesBucket, Arn]
- '/submissions/'