Невозможно загрузить артефакт None, на который ссылается параметр CodeUri ресурса HelloWorldFunction

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

Вот код, который у меня есть:

template.yml:

AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10

index.js

exports.handler = async function(event, context) {
    return 'Hello World!';
};

Когда я бегу

sam package \
  --template-file template.yml \
  --output-template-file package.yml \
  --s3-bucket brian-test-sam

Я получил ошибку, сказав Unable to upload artifact None referenced by CodeUri parameter of HelloWorldFunction resource. An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

Почему это происходит?

Я создал ведро S3 brian-test-sam на моем аккаунте AWS. Я проверил, что мой пользователь IAM имеет AmazonS3FullAccess разрешение.

Команда

sam --debug package \                                                                                           <aws:dev-bionime>
  --template-file template.yml \
  --output-template-file package.yml \
  --s3-bucket brian-test-sam

говорит, что ошибка была сгенерирована aws cloudformation package --output-template-file package.yml --s3-bucket brian-test-sam --template-file /path/to/my/files/helloworld/template.yml

Что не так с моей облачной информацией?

Моя версия aws cli aws-cli/1.16.169 Python/3.7.3 Darwin/18.6.0 botocore/1.12.159, И мой npm версия 6.10.1,

10 ответов

Даже столкнувшись с этой проблемой, я предпринял следующие действия.

Проблема возникла из-за несовпадения корзины в app.py и в команде пакета sam, поэтому исправил имя корзины и снова выполнил команды "sam build" и "sam package", у меня это сработало!

Еще одна забота: если вы столкнулись с проблемой времени при запуске "пакета sam", то должно быть недействительное системное время, исправьте его и снова запустите "пакет sam".

Я обнаружил, что эта ошибка связана с тем, что я не добавил доступ S3 к роли службы, которая запускает сборку.

На вкладке "Разрешения" в разделе "Роль" выберите кнопку "Прикрепить политики" и выберите "AmazonS3FullAccess", прикрепите его с помощью кнопки "Прикрепить политику".

Теперь перезапустите вашу сборку.

Для меня проблема заключалась в том, что мои учетные данные aws были из неправильной учетной записи. aws s3 ls показал проблему довольно быстро.

Я только что обновил свои учетные данные профиля AWS, и у меня это сработало.

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

Это также может произойти, когда вы делаете за которым следует и вы не указываете файл шаблона, созданный на этапе сборки. Если вы удалите --template-file или укажете на файл .aws, созданный в сборке sam, это устранит эту проблему.

Я столкнулся с той же проблемой при выполнении следующей команды:

sam package \
  --template-file template.yml \
  --output-template-file package.yml \
  --s3-bucket <your_bucket_name>

В приведенной выше команде отсутствовали учетные данные AWS с профилем по умолчанию. [У меня не было профиля по умолчанию в конфигурациях AWS] Если профиль по умолчанию не найден, вам может потребоваться указать имя профиля в команде, как показано ниже

sam package \
  --template-file template.yml \
  --output-template-file package.yml \
  --s3-bucket brian-test-sam \
  --profile <profile_name>

Если у вас есть эта проблема, и она также показывает следующие сообщения об ошибках: Ошибка: невозможно загрузить артефакт HelloWorldFunction, на который ссылается параметр CodeUri ресурса HelloWorldFunction.

ZIP не поддерживает метки времени до 1980 года.

Тогда проблема в том, что временные метки файлов старше 1980 года. Это легко исправить в терминале, в папке, из которой вы пытаетесь запустить «sam deploy», просто запустите это, чтобы обновить временные метки:

      touch `find . -type f`
      Uploading to 5ede295b3d735d7cadf2a5368bcff051  124068 / 124068.0  (100.00%)
Successfully packaged artifacts and wrote output template to file package.yaml.
Execute the following command to deploy the packaged template..........

работал у меня, применяя политику ведра, как показано ниже

      {
    "Version": "2012-10-17",
    "Id": "Policy1624441771081",
    "Statement": [
        {
            "Sid": "Stmt1624441768741",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "<your_bucket_arn>/*"
        }
    ]
}

Вы должны предоставить CodeUri свойство, указывающее ваш локальный каталог.

AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: ./code