当前位置: 首页 > 知识库问答 >
问题:

为什么AWS boto3调用associate_iam_instance_profile会导致无效名称的无效名称无效?

王涵育
2023-03-14

我有调用AWS boto3 API的代码。此代码使用iam客户端和ec2客户端执行以下几项操作:

iam_client = boto3.client('iam')
ec2_client = boto3.client('ec2')

对于所有这些调用,角色名和配置文件名都是相同的:MyExampleName

  1. 调用iam\U客户端。创建实例配置文件以创建新的实例配置文件

但最后一次呼叫失败,出现如下消息:

INFO”失败:调用AssociateIamInstanceProfile操作时发生错误(InvalidParameterValue):参数iamInstanceProfile.name的值(MyCanpleName)无效。无效的IAM实例配置文件名,帐户ID: XXXXXXXXXXXXX,资源: EC2实例: i-78sd976sd6912"

我刚刚创建了个人资料,那么为什么打电话给associate_iam_instance_profile说它是无效的呢?

共有2个答案

祁博涛
2023-03-14

使用IAM客户机和EC2客户机时都有一点时间问题。通过iam\u客户端创建的配置文件可能不会立即被ec2\u客户端使用。通过一些重试逻辑,名称似乎最终会起作用——它并不是真的无效,只是还没有找到:

import time

logger.info('Attaching profile: MyExampleName'))
counter = 0
while counter < 60:
    try:
        ec2_client.associate_iam_instance_profile(IamInstanceProfile={'Name': 'MyExampleName'},
                                                  InstanceId='i-78sd976sd6912')
        break
    except ClientError as err:
        if err.response['Error']['Code'] == 'InvalidParameterValue':
            counter = counter + 1
            logger.info('The ec2 client did not find the profile yet; wait 1 second and then try again')
            time.sleep(1)
logger.info('Finally worked!')

以下日志显示了一个真实世界的日志条目示例,这些日志条目显示EC2客户端最终与IAM客户端一致:

INFO "Attaching profile: MyExampleName"
INFO "The profile is not found yet; wait 1 second and then try again"
INFO "The profile is not found yet; wait 1 second and then try again"
INFO "The profile is not found yet; wait 1 second and then try again"
INFO "The profile is not found yet; wait 1 second and then try again"
INFO "The profile is not found yet; wait 1 second and then try again"
INFO "The profile is not found yet; wait 1 second and then try again"
INFO "The profile is not found yet; wait 1 second and then try again"
INFO "The profile is not found yet; wait 1 second and then try again"
INFO "The profile is not found yet; wait 1 second and then try again"
INFO "Finally worked!"

谷飞星
2023-03-14

更方便的方法是依靠专门构建的服务员等待某些资源可用。

waiter = client.get_waiter('instance_profile_exists')
waiter.wait(
    InstanceProfileName='string',
    WaiterConfig={
        'Delay': 123,
        'MaxAttempts': 123
    }
)

您的方法的问题是,您依赖于资源将在60秒内创建的假设,但情况可能并非总是如此。而服务员则继续轮询,直到资源可用。

阅读更多关于可用服务员的信息https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/iam.html#IAM.Client.get_waiter

 类似资料:
  • 问题内容: 我真的尽力找到一种方法,使用javascript加载网页来抓取网站,以便例如我的播放列表抓取。我对chrome驱动程序和phantomjs都不满意。请在下面查看,看看是否可以帮助我解决错误。 我的packages.config文件如下: 问题答案: .NET语言绑定标记了PhantomJS驱动程序类在3.11中已弃用,而这些类在3.14中已删除。PhantomJS项目及其驱动程序将不再

  • 问题内容: 我有一个方法,该方法将为准备好的语句执行带有QueryParameters列表的查询。该和只是小的Java bean和基础上,应该是不言自明的就是你在这里看到。我正在尝试使用,而不是使用,其中是STRING类型,值是。但是,我遇到了错误。我的代码和输出如下。这是怎么回事? 输出: 问题答案: 我相信参数仅适用于 值 -不适用于SQL查询的一部分,例如表格。可能有一些数据库支持您要实现的

  • 为什么这显示错误... 第1行错误: ORA-65096:公用用户名或角色名无效

  • 我刚开始在应用程序中出现以下错误。当安装和运行同一个应用程序时,在安装看似成功之后,我会得到一条错误消息: 应用程序验证未成功

  • 我使用JavaMail和协议imap来组织电子邮件(gmail)。我创建了一个文件夹FOLDER1,代码如下: 我用代码移动消息: 它的工作原理 但我不明白。。。如果我想再次阅读邮件,但不想阅读已阅读的邮件,也不想阅读已创建文件夹中的邮件,则无法再次阅读。该名称已在收件箱中 有什么问题吗? 谢谢你的帮助

  • 我在 Azure 表存储中有下表名称。表名是在我的应用程序中自动生成的,然后使用表创建。创建如果不存在(表名)。有些有效,有些则不然。当我深入研究错误时,扩展的错误信息告诉我资源名称包含无效字符 - 但是我无法弄清楚失败名称中无效的内容 - 任何人都可以发现这一点吗? -指定的资源名称包含无效字符 -指定的资源名称包含无效字符 –工程