Amazon web services &引用;botocore.exceptions.NoRegionError:您必须指定一个区域;部署到ECR时
我按照教程使用CDK部署到ECS,但当我部署时,部署后会出现此错误Amazon web services &引用;botocore.exceptions.NoRegionError:您必须指定一个区域;部署到ECR时,amazon-web-services,boto3,amazon-ecs,aws-cdk,Amazon Web Services,Boto3,Amazon Ecs,Aws Cdk,我按照教程使用CDK部署到ECS,但当我部署时,部署后会出现此错误 botocore.exceptions.NoRegionError: You must specify a region. 以下是我正在部署的内容 app.py #!/usr/bin/env python3 from os import environ from aws_cdk import core as cdk from ecs_test.ecs_test_stack import EcsTestStack _env
botocore.exceptions.NoRegionError: You must specify a region.
以下是我正在部署的内容
app.py
#!/usr/bin/env python3
from os import environ
from aws_cdk import core as cdk
from ecs_test.ecs_test_stack import EcsTestStack
_env=cdk.Environment(account=environ["CDK_DEFAULT_ACCOUNT"], region='ap-southeast-2')
app = cdk.App()
EcsTestStack(app, "EcsTestStackV3", env=_env)
app.synth()
ecs_test_stack.py
from aws_cdk import core, aws_ecs_patterns, aws_ec2, aws_ecs
class EcsTestStack(core.Stack):
def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
_container_image = aws_ecs.ContainerImage.from_asset(
directory=".",
file='Dockerfile.ECS_Test',
exclude=["cdk.out"]
)
vpc = aws_ec2.Vpc(self, "ecs-test-vpc-v3", max_azs=3)
cluster = aws_ecs.Cluster(self, "ecs-test-cluster-v3", vpc=vpc)
cluster.add_capacity("ecs-autoscaling-capacity-v3",
instance_type=aws_ec2.InstanceType("t2.small"),
min_capacity=1,
max_capacity=3)
self.ecs_test = aws_ecs_patterns.QueueProcessingEc2Service(
self,
"ECS_Test_Pattern_v3",
cluster=cluster,
cpu=512,
memory_limit_mib=512,
image=_container_image,
min_scaling_capacity=1,
max_scaling_capacity=5
)
Dockerfile.ECS_测试
from alpine:3.8
RUN apk add -U python3 py3-pip && pip3 install awscli boto3
COPY ./ecs_test/queue_service.py /queue_service.py
CMD ["/queue_service.py","receive"]
queue_service.py
#!/usr/bin/env python3
from boto3 import resource
from os import getenv
from time import sleep
from random import randrange
from sys import argv
def get_queue_details():
sqs = resource('sqs')
print(getenv('QUEUE_NAME'))
return sqs.get_queue_by_name(QueueName=getenv('QUEUE_NAME'))
def receive():
queue = get_queue_details()
while True:
for message in queue.receive_messages():
print("MESSAGE CONSUMED: {}".format(message.body))
print(message.delete())
sleep(1)
def send(num_messages=100):
queue = get_queue_details()
for _num in range(num_messages):
_rand = randrange(1000)
print(queue.send_message(MessageBody=str(_rand)))
if __name__ == '__main__':
try:
if argv[1] == 'send':
send()
if argv[1] == 'receive':
receive()
except IndexError as I:
print("Please pass either send or receive.\n./queue_service.py <send> <receive>")
exit(200)
os.environ['AWS_DEFAULT_REGION'] = 'us-west-2'
#/usr/bin/env蟒蛇3
从boto3导入资源
从操作系统导入getenv
从时间上导入睡眠
从随机输入范围
从系统导入argv
def get_queue_details():
sqs=资源(“sqs”)
打印(getenv('QUEUE_NAME'))
返回sqs.get_queue_by_name(QueueName=getenv('queue_name'))
def receive():
队列=获取队列详细信息()
尽管如此:
对于队列中的消息。接收消息():
打印(“消息消耗:{}”。格式(MESSAGE.body))
打印(message.delete())
睡眠(1)
def发送(num_messages=100):
队列=获取队列详细信息()
对于范围内的_num(num_消息):
_兰特=兰特范围(1000)
打印(queue.send_message(MessageBody=str(_rand)))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
如果argv[1]=“发送”:
发送()
如果argv[1]=“接收”:
接收()
除索引器as I外:
打印(“请通过发送或接收。\n./queue_service.py”)
出口(200)
queue_service.py在我的系统上本地运行时运行良好,但是当我使用CDK部署并填充队列时,我会得到botocore.exceptions.NoRegionError:您必须指定一个区域。
错误
问题:
如何在我的ECS上设置区域?您必须通知BOT3您要在哪个区域使用sqs资源
sqs = resource('sqs', region_name='us-west-2')
在sqs资源的queue_service.py中设置region_name
sqs = resource('sqs', region_name='us-west-2')
或
在queue_service.py中设置AWS_DEFAULT_REGION
环境变量
#!/usr/bin/env python3
from boto3 import resource
from os import getenv
from time import sleep
from random import randrange
from sys import argv
def get_queue_details():
sqs = resource('sqs')
print(getenv('QUEUE_NAME'))
return sqs.get_queue_by_name(QueueName=getenv('QUEUE_NAME'))
def receive():
queue = get_queue_details()
while True:
for message in queue.receive_messages():
print("MESSAGE CONSUMED: {}".format(message.body))
print(message.delete())
sleep(1)
def send(num_messages=100):
queue = get_queue_details()
for _num in range(num_messages):
_rand = randrange(1000)
print(queue.send_message(MessageBody=str(_rand)))
if __name__ == '__main__':
try:
if argv[1] == 'send':
send()
if argv[1] == 'receive':
receive()
except IndexError as I:
print("Please pass either send or receive.\n./queue_service.py <send> <receive>")
exit(200)
os.environ['AWS_DEFAULT_REGION'] = 'us-west-2'
或
在Dockerfile
ENV AWS_DEFAULT_REGION=us-west-2
或
在ECS任务定义中设置环境变量您必须通知BOT3您要在哪个区域使用sqs资源
sqs = resource('sqs', region_name='us-west-2')
在sqs资源的queue_service.py中设置region_name
sqs = resource('sqs', region_name='us-west-2')
或
在queue_service.py中设置AWS_DEFAULT_REGION
环境变量
#!/usr/bin/env python3
from boto3 import resource
from os import getenv
from time import sleep
from random import randrange
from sys import argv
def get_queue_details():
sqs = resource('sqs')
print(getenv('QUEUE_NAME'))
return sqs.get_queue_by_name(QueueName=getenv('QUEUE_NAME'))
def receive():
queue = get_queue_details()
while True:
for message in queue.receive_messages():
print("MESSAGE CONSUMED: {}".format(message.body))
print(message.delete())
sleep(1)
def send(num_messages=100):
queue = get_queue_details()
for _num in range(num_messages):
_rand = randrange(1000)
print(queue.send_message(MessageBody=str(_rand)))
if __name__ == '__main__':
try:
if argv[1] == 'send':
send()
if argv[1] == 'receive':
receive()
except IndexError as I:
print("Please pass either send or receive.\n./queue_service.py <send> <receive>")
exit(200)
os.environ['AWS_DEFAULT_REGION'] = 'us-west-2'
或
在Dockerfile
ENV AWS_DEFAULT_REGION=us-west-2
或
在ECS任务定义中设置环境变量注意,它在OP的工作站上工作的原因可能是他们在
~/.aws/config
中设置了默认区域。我如何使其更通用,而不必硬编码该区域?无论如何,您需要提及该区域。另一个选项是设置ENV为Dockerfile。这样可以避免在代码中硬编码。或者在您的ECS任务定义文件中,添加AWS_DEFAULT_REGION env注意,它在OP的工作站上工作的原因可能是他们在~/.AWS/config
中设置了默认区域。我如何使其更通用,而不必硬编码该区域?无论如何,您需要提及该区域。另一个选项是设置ENV为Dockerfile。这样可以避免在代码中硬编码。或者在您的ECS任务定义文件中,添加AWS\u DEFAULT\u REGION env