CloudFormation - Неразрешенные зависимости ресурсов для переменных политики? - PullRequest
0 голосов
/ 08 октября 2019

Я создал шаблон CloudFormation, который развертывает функцию AWS Lambda, которая вызывается AWS Transfer для аутентификации пользователей sftp. Функция Lambda возвращает политику, которую AWS Transfer выбирает и использует для блокировки прав пользователей sftp.

Эта политика включает переменные:

  • transfer:HomeFolder
  • transfer:HomeBucket
  • transfer:HomeDirectory

Документацию о том, что делают эти переменные, см. В: Редактирование конфигурации пользователя - передача AWS для SFTP

Когда я пытаюсь развернуть мой шаблон CloudFormation, я получаю следующую ошибку:

Произошла ошибка (ValidationError) при вызове операции CreateChangeSet: Ошибка формата шаблона: Неразрешенные зависимости ресурса [Transfer: HomeFolder, Transfer: HomeBucket, передача: HomeDirectory] в блоке ресурсов шаблона.

Возможно ли переопределить параметры CloudFormation для переменных политики: transfer:HomeFolder, transfer:HomeBucket, transfer:HomeDirectory?

Вот лямбда-часть моего шаблона CloudFormation:

GetUserConfigLambda:
  Type: AWS::Lambda::Function
  Properties:
    Code:
    ZipFile:
      Fn::Sub: |
      'use strict';

      const https = require('https');

      exports.handler = (event, context, callback) => {
          const data = JSON.stringify({
            username: event.username,
            password: event.password
          });

          const options = {
              hostname: '${Url}',
              path: '/api/v1.0/users',
              method: 'POST',
              headers: {
                  'Content-Type': 'application/json',
                  'Content-Length': data.length
              }
          };

          var policy = {
            "Version": "2012-10-17",
            "Statement": [
              {
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation"
                ],
                "Effect": "Allow",
                "Resource": [
                  "arn:aws:s3:::${transfer:HomeBucket}"
                ],
                "Condition": {
                  "StringLike": {
                    "s3:prefix": [
                      "${transfer:HomeFolder}/*",
                      "${transfer:HomeFolder}"
                    ]
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "s3:PutObject",
                  "s3:GetObject",
                  "s3:DeleteObjectVersion",
                  "s3:DeleteObject",
                  "s3:GetObjectVersion"
                ],
                "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
              },
              {
                "Action":[
                  "s3:PutObject"
                ],
                "Effect":"Deny",
                "Resource":"arn:aws:s3:::${transfer:HomeDirectory}/*/"
              }
            ]
          }

          var req = https.request(options, (res) => {
              console.log("Status code: ", res.statusCode);

              let data = '';
              res.on('data', (chunk) => {
                  data += chunk;
              }).on('end', () => {
                  let response = JSON.parse(data);
                  let lambdaResponse = {};

                  if('data' in response &&
                      'name' in response['data']) {
                      lambdaResponse = {
                          // Required.
                          Role: 'arn:aws:iam::669858054894:role/${UserRole}',

                          // JSON blob which further restrict this user's permissions.
                          Policy: JSON.stringify(policy),

                          // Home directory is a concatenation of home bucket and integration name.
                          HomeDirectory: "/${SftpS3Bucket}/" + response['data']['name'],

                          // Name of home bucket.
                          HomeBucket: "${SftpS3Bucket}"
                      }
                  }

                  callback(null, lambdaResponse);
              });
          }).on("error", (err) => {
              console.log("Error: ", err.message);

              callback(null, {});
          });

          req.end(data);
      };

1 Ответ

0 голосов
/ 08 октября 2019

Я подозреваю, что CloudFormation может запутаться из-за блоков ${xx}, которые имеют особое значение в шаблоне CloudFormation.

Я думаю, что вы просто хотите передать эти значения в виде текста, который затем будетинтерпретируется в рамках политики IAM.

Этого можно избежать, разбив текстовую строку в Python, например:

"arn:aws:s3:::$""{transfer:HomeBucket}"
...