如何对AWS CloudFormation模板进行属性配置以运行Fargate的容器



我关注这篇关于在AWS Fargate上托管一个无服务器的Scrapy应用程序的优秀博客文章。到目前为止,这是我的树结构:

.
├── Dockerfile
├── Makefile
├── fargate-template.yml
├── handler.py
├── launch_fargate.py
├── launcher.py
├── my_sls_scraper
├── node_modules
├── package-lock.json
├── package.json
├── requirements.txt
├── s3-template.yml
├── scrapy.cfg
└── serverless.yml

但是,使用sls deploy -v进行部署会出现以下错误:Unable to resolve '3' log group name out of: {RetentionInDays: 1}

以下是完整的错误:

Serverless: Configuration warning:
Serverless:   at root: unrecognized property 'events'
Serverless:   at 'functions.pollSpidersScrape.events[0]': unsupported function event
Serverless:  
Serverless: Learn more about configuration validation here: http://slss.io/configuration-validation
Serverless:  
Serverless: Generated requirements from /Users/Desktop/scrapy-serverless/scraper/requirements.txt in /Users/Desktop/scrapy-serverless/scraper/.serverless/requirements.txt...
Serverless: Using static cache of requirements found at /Users/Library/Caches/serverless-python-requirements/c31122786e70934d64a78fc1a8e1e713bf397712d1d00d20399c3fe5907a73b4_slspyc ...
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...
Serverless: serverless-cloudformation-sub-variables: Converting AWS CloudFormation Sub variables...
Serverless:  - 'arn:aws:s3:::#{BucketName}/*' => 'arn:aws:s3:::${BucketName}/*'
Serverless:  - 'arn:aws:s3:::#{BucketName}' => 'arn:aws:s3:::${BucketName}'
Serverless:  - 'fargate-#{StackName}' => 'fargate-${StackName}'
Serverless:  - 'arn:aws:s3:::#{BucketName}/*' => 'arn:aws:s3:::${BucketName}/*'
Serverless:  - 'arn:aws:s3:::#{BucketName}/*' => 'arn:aws:s3:::${BucketName}/*'
Serverless:  - 'arn:aws:s3:::#{BucketName}' => 'arn:aws:s3:::${BucketName}'
Serverless:  - '#{AccountId}.dkr.ecr.#{Region}.amazonaws.com/#{Repo}' => '${AccountId}.dkr.ecr.${Region}.amazonaws.com/${Repo}'
Serverless:  - '#{AccountId}.dkr.ecr.#{Region}.amazonaws.com/#{Repo}' => '${AccountId}.dkr.ecr.${Region}.amazonaws.com/${Repo}'

Serverless Error ----------------------------------------

Unable to resolve '3' log group name out of: { RetentionInDays: 1 }

我认为这个错误与配置文件有关,但我不确定Unable to resolve '3' log group是什么意思。我确信错误源自fargate-template.yml:

Resources:
FargateECSCluster:
Type: "AWS::ECS::Cluster"
Properties:
ClusterName: !Sub
- "fargate-#{StackName}"
- StackName: !Ref "AWS::StackName"
FargateLogGroup:
Type: "AWS::Logs::LogGroup"
Properties:
RetentionInDays: 1
FargateTaskRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Sid: "ECS"
Principal:
Service:
- ecs-tasks.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: ScraperFeedBucketPolicy
PolicyDocument:
Statement:
- Effect: "Allow"
Action:
- "s3:PutObject"
Resource: !Sub
- "arn:aws:s3:::#{BucketName}/*"
- BucketName: !Ref ScraperFeedBucket
- PolicyName: HttpCacheBucketPolicy
PolicyDocument:
Statement:
- Effect: "Allow"
Action:
- "s3:GetObject"
- "s3:PutObject"
- "s3:ListBucket"
Resource:
- !Sub
- "arn:aws:s3:::#{BucketName}/*"
- BucketName: !Ref HttpCacheBucket
- !Sub
- "arn:aws:s3:::#{BucketName}"
- BucketName: !Ref HttpCacheBucket
FargateExecutionRole:
Type: AWS::IAM::Role
Properties:
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Sid: "ECS"
Principal:
Service:
- ecs-tasks.amazonaws.com
Action:
- sts:AssumeRole
FargateVPC:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: 10.10.10.0/24
Tags:
- Key: Name
Value: !Ref "AWS::StackName"
FargateSubnet:
Type: "AWS::EC2::Subnet"
Properties:
CidrBlock: 10.10.10.0/24
VpcId: !Ref FargateVPC
Tags:
- Key: Name
Value: !Ref "AWS::StackName"
FargateIGW:
Type: "AWS::EC2::InternetGateway"
Properties:
Tags:
- Key: Name
Value: !Ref "AWS::StackName"
FargateAttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref FargateVPC
InternetGatewayId: !Ref FargateIGW
FargateRouteTable:
Type: "AWS::EC2::RouteTable"
Properties:
VpcId: !Ref FargateVPC
Tags:
- Key: Name
Value: !Ref "AWS::StackName"
FargateRoute:
Type: "AWS::EC2::Route"
DependsOn: FargateAttachGateway
Properties:
RouteTableId: !Ref FargateRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref FargateIGW
FargateSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref FargateRouteTable
SubnetId: !Ref FargateSubnet
FargateSG:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "Generated by Serverless"
SecurityGroupIngress:
- IpProtocol: -1
CidrIp: 127.0.0.1/32
Tags:
- Key: Name
Value: !Ref "AWS::StackName"
VpcId: !Ref FargateVPC
FargateECSRepo:
Type: "AWS::ECR::Repository"
Properties:
LifecyclePolicy:
LifecyclePolicyText: |
{
"rules": [
{
"rulePriority": 1,
"description": "Only keep 8 images",
"selection": {
"tagStatus": "any",
"countType": "imageCountMoreThan",
"countNumber": 8
},
"action": { "type": "expire" }
}]
}
FargateECSTaskDefinition:
Type: "AWS::ECS::TaskDefinition"
Properties:
Cpu: 512
Memory: 1GB
NetworkMode: awsvpc
RequiresCompatibilities:
- "FARGATE"
ExecutionRoleArn: !GetAtt FargateExecutionRole.Arn
TaskRoleArn: !GetAtt FargateTaskRole.Arn
ContainerDefinitions:
- Name: scraper_container
Image: !Sub
- "#{AccountId}.dkr.ecr.#{Region}.amazonaws.com/#{Repo}"
- AccountId: !Ref AWS::AccountId
Region: !Ref AWS::Region
Repo: !Ref FargateECSRepo
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group: !Ref FargateLogGroup
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: !Ref AWS::StackName
Outputs:
ECRRepo:
Value: !Sub
- "#{AccountId}.dkr.ecr.#{Region}.amazonaws.com/#{Repo}"
- AccountId: !Ref AWS::AccountId
Region: !Ref AWS::Region
Repo: !Ref FargateECSRepo

如何解决上述错误再次,我怀疑这是一个配置问题,因为在我的本地机器上运行docker build -t my_sls_scraper:latest .docker run my_sls_scraper可以毫无问题地运行scraper。

编辑:

删除FargateLogGroup没有帮助,因为它返回以下错误:An error occurred: my-sls-scraper-dev - Template format error: Unresolved resource dependencies [FargateLogGroup] in the Resources block of the template.也就是说,FargateLogGroup必须包含在.yml中。

我通过将LogGroupName: 'someName'添加到FargateLogGroup:使其工作

FargateLogGroup:
Type: "AWS::Logs::LogGroup"
Properties:
LogGroupName: 'someName'
RetentionInDays: 1

这是一个文档问题,因为CloudFormation[文档][2]提到不需要任何字段。

最新更新