Я пишу тесты на Python, чтобы убедиться, что Amazon S3 (сервис в целом) работает как задумано.
Настройка: CodePipeline использует CodeBuild для создания корзины S3 с использованием шаблона CloudFormation, а затем запускает другое задание CodeBuild для запуска тестов python для S3, созданного на предыдущем шаге.
Мне нужно написать тесты для этих двух требований:
«Неавторизованные пользователи должны получить ответ 403 при попытке изменить корзину S3».
и
«Авторизованные пользователи должны иметь возможность успешно получить доступ и изменить корзину S3.»
Второй тест не проблема, но я не уверен, как написать первый тест.
Мой вопрос: как я могу получить тест python для проверки корзины S3 как неавторизованного пользователя ? У CodeBuild уже есть разрешения на доступ к корзинам S3, поэтому я не уверен, как заставить тесты (которые запускаются с CodeBuild) НЕ иметь разрешения на доступ к ним и получить нужные мне 403.
Вот еще несколько подробностей, которые могут оказаться полезными:
Конвейер имеет 4 фазы: источник, сборка, развертывание, тестирование сборки и удаление. Этап развертывания - это этап, на котором блоки S3, которые мне нужно протестировать, устанавливаются с использованием стека CloudFormation. На этапе сборки теста я на самом деле запускаю эти тесты на Python, поэтому я полагаю, что мне нужно реализовать решение этой проблемы.
В конечном итоге весь этот процесс будет инициирован с помощью шаблона CloudFormation, который создает конвейер, который будет иметь все эти фазы. Но сейчас он просто использует конвейер из консоли AWS. Я упоминаю об этом только в том случае, если что-то возможно (или не возможно) из CloudFormation сделать эту работу, которая может (не) быть доступна в CodeBuild.
К сожалению, у меня не так много кода Python, которым я могу поделиться здесь, так как это первый тест, который мне нужно написать, и я не знаю, как к нему подойти. Но я могу вам сказать, что я использую Boto3 и запускаю тесты с помощью unittest. Я нахожу сегменты, проверяя текущие стеки в CloudFormation, и проверяя, какой из них соответствует имени стека тестов, а затем извлекаю ресурс S3 из этого стека. Это ведро, которое я тестирую. Так или иначе, мне нужно увидеть это ведро, попытаться получить к нему доступ и получить отказ в одном тесте, а затем получить доступ в другом тесте.
#python 3.6
import os
import boto3
import unittest
rootstack = os.getenv('RootStackName') # environment variable in the build
region = 'us-west-2'
buckets = {}
class TestS3(unittest.TestCase):
def setUp(self):
self.customBucket = None
self.customBucket = buckets['customBucket']
if self.customBucket is None:
raise ValueError('Test bucket not found in test setUp!')
def test_bucket_accessible_if_authorized(self):
# Authorized user can access the bucket
self.assertEqual(????)
def test_bucket_cant_be_accessed_if_unauthorized(self):
# Unauthorized user CANNOT access the bucket
self.assertEqual(????)
if __name__=='__main__':
try:
cfn = boto3.client('cloudformation', region_name=region)
response = cfn.describe_stack_resources(StackName=rootstack)
resources = response['StackResources']
for resource in resources:
if resource['ResourceType'] == 'AWS::S3::Bucket':
print('FOUND THE CUSTOM BUCKET')
buckets['customBucket'] = resource
unittest.main(verbosity=2)
except Exception as e:
print("Unknown Error, %s" %(e))