AWS CDK дают разрешение на ресурсы вне стека - PullRequest
0 голосов
/ 21 февраля 2020

Я довольно плохо знаком с AWS CDK и не имел большого опыта работы с AWS. В моем стеке CDK, который я пишу, я должен дать разрешения ресурсам, которые созданы с помощью других шаблонов CDK и уже находятся в aws.

Допустим, мой стек A содержит лямбду, лямбда будет быть вызванным из другой службы X. Служба X должна иметь разрешение на запуск лямбда-выражения. Могу ли я дать сервису X разрешение из кода стека A или мне нужно будет изменить стек сервиса X?

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Вам не нужно изменять службу X Stack.

В примерах ниже предполагается, что вы используете машинопись.

Если вы хотите разрешить весь сервис (не рекомендуется) вызывать разрешение для вашей лямбды, вы можете использовать следующее:

Для S3

yourfunction.grantInvoke(new ServicePrincipal('s3.amazonaws.com'));

Для SNS

yourfunction.grantInvoke(new ServicePrincipal('sns.amazonaws.com'));

Но я бы порекомендовал указать указанный * ARN ресурса c, который вы хотите разрешить вызывать лямбду. Например, если это другая лямбда-функция, вы можете указать ее роль ARN следующим образом:

yourfunction.grantInvoke(new ArnPrincipal('arn:aws:iam:region:account-id:role/role-name'));

И, как упомянул Амит в своем ответе, вы также можете использовать addPermission, если вы хотите указать более детальные разрешения. Вы можете использовать addPermission, чтобы даже разрешить ресурсам других AWS учетных записей вызывать вашу лямбду.

1 голос
/ 21 февраля 2020

В общем случае ответ - да, вы можете добавить разрешения для ресурсов, созданных вне стека. Но вы должны убедиться, что ресурс импортируется.

Использование лямбды:

добавить политику к роли лямбды:

Подробнее здесь .

const importedLambda = lambda.Function.fromFunctionArn(scope,`${name}-lambda`,${LAMBDA_ARN});

importedLambda.addToRolePolicy(new iam.PolicyStatement({
  effect: iam.Effect.ALLOW,   // ... and so on defining the policy
}));

добавить разрешение для лямбды:

Подробнее здесь .

const importedLambda = lambda.Function.fromFunctionArn(scope,`${name}-lambda`,${LAMBDA_ARN});

importedLambda.addPermission('allowInvocation',{
  principal: new ServicePrincipal('events.amazonaws.com'), // ... and so on defining the permission
 sourceArn: ...
});
...