web-dev-qa-db-ja.com

複数のAWSアカウントで資格情報を管理する推奨方法は?

botoを介して複数のAmazon Web Services(AWS)アカウントを管理する最良の方法は何ですか?

私が使用している BotoConfig ファイルに精通しています。しかし、各ファイルは単一のアカウントのみを記述しています...そして、私は複数の組織で作業しています。通常の法的、財政的、およびセキュリティ上の理由から、これらのアカウントを混ぜることはできません。

現在、アカウントごとに1つのboto構成ファイルを使用しています。例えば。:

  • ~/.boto デフォルトのアカウント
  • ~/.boto_clowncollege「クラウンカレッジ」アカウント用
  • ~/.boto_razorassoc「razorassoc」アカウント
  • ~/.boto_xyz「xyz」アカウント用

その後、次のようなもの:

def boto_config_path(account=None):
    """
    Given an account name, return the path to the corresponding boto
    configuration file. If no account given, return the default config file.
    """
    path = '~/.boto' + ('_' + account if account else '')
    clean_path = os.path.abspath(os.path.expanduser(path))
    if os.path.isfile(clean_path):
        return clean_path
    else:
        errmsg = "cannot find boto config file {} for {}".format(clean_path, account)
        raise ValueError(errmsg)

def aws_credentials(account=None):
    """
    Return a Tuple of AWS credentials (access key id and secret access key) for
    the given account.
    """
    try:
        cfg = INIConfig(open(boto_config_path(account)))
        return ( cfg.Credentials.aws_access_key_id, cfg.Credentials.aws_secret_access_key )
    except Exception:
        raise

conn = EC2Connection(*aws_credentials('razorassoc'))

良い、悪い、または無関心ですか?改善の提案はありますか?

29
Jonathan Eunice

将来、botoは複数の資格情報の管理に役立つより良いツールを提供しますが、現時点では、役立つ可能性のある環境変数がいくつかあります。

最初に、使用するboto構成ファイルを指すようにBOTO_CONFIGを設定できます。これにより、通常の場所にある構成ファイルが上書きされます。

次に、BOTO_PATHをコロンで区切られた場所のリストに設定して、boto configファイルを検索すると、通常の検索場所の前に最初に検索されます。

どちらもあなたが望むものを正確に提供するわけではありませんが、少し少ないコードで簡単に達成できるかもしれません。

これをbotoでどのように動作させるかについてのアイデアがある場合は、お知らせください!

9
garnaat

2015-02-06を更新、2015-03-19を修正

BotoおよびAWSCLI認証情報の新しい標準化された共有(boto> == 2.29.0)

Boto 2.29以降、Mike Garnaatが AWS SDKの認証情報を管理するための新しい標準化された方法

目的は次のとおりです。

  1. boto、AWSCLI、および場合によっては他のSDKによる認証情報の共有を許可します
  2. ユーザープロファイルディレクトリにある単一のファイルにすべての構成を保持する
  3. 名前付きプロファイルの使用を許可する
  4. 可能な限りシンプルに保つ(例:他の方法との競合を防ぐ)

資格情報ファイルを作成する

ファイル~/.aws/credentials(Mac/Linux)または%USERPROFILE%\.aws\credentials(Windwos)を次のように作成します。

[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1

[jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1

[hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ
region = eu-west-1

これからは、次のようなコードを使用できます。

デフォルトのプロファイルを使用

import boto
con = boto.connect_s3()

AWS_PROFILE envで設定された明示的なプロファイルを使用します。 var

(これは、プロファイル名をコードから外し、アプリケーションのデプロイヤに特定のプロファイルを選択する機会を与える私のお気に入りのオプションです)

$ export AWS_PROFILE=jekyl

そして、コードを以前と同じようにシンプルに保ちます。

import boto
con = boto.connect_s3()

コードで明示的なプロファイルを指定する

import boto
con = boto.connect_s3(profile_name="jekyl")

これは、通常行う必要があるすべてです

適切な資格情報を選択するためのロジックは、次のように boto issue#2292 で説明されています。

優先順位が最高から最低へのロード順:

1.コードから直接渡される

  1. キー/シークレットの環境変数

  2. プロファイルの環境変数

  3. 共有資格情報ファイルの明示的プロファイル

  4. 共有資格情報ファイルのデフォルトプロファイル

  5. 構成ファイルの明示的プロファイル

  6. 構成ファイルの資格情報セクション

コードから渡されたプロファイルは、環境変数の設定をオーバーライドします。

物事を簡潔でシンプルに保つには、古いメソッドを削除するのが良いので、古いスタイルのファイル(~/.aws/config~/.botoなど)を削除し、設定されている場合はBOTO_CONFIGを設定解除しますまた、そのような変数が指すファイル。

そして、これがboto> = 2.29.0のすべてです

注:env.variable(AWS_CONFIG_FILEなど)によって構成ファイルの場所を制御しようとしないでください。期待どおりに機能しません。

Boto configプロファイルを使用(boto> = 2.24.0)

以下の説明は、boto 2.29.0以降にアップグレードできないユーザーのみを対象にしています

Boto 2.24.0以降、profile_nameという機能があります

~/.botoファイルには、既に[Credentials]セクションがあります。これはフォールバックオプションとして機能し、[profile]セクションは異なるプロファイルに対応します。

[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ

次に、接続を作成するときに、次の方法を使用します。

import boto
con = boto.connect_s3(profile_name="jekyl")

この機能はboto 2.24.0以降で使用可能です。

チュートリアルはこちら http://docs.pythonboto.org/en/latest/boto_config_tut.html?highlight=profile

キーリングの使用に関する注意事項もありますが、最初にこのプロファイルに慣れるのは、数年前から夢見ていたことです。

設定ファイルをAWSCLIと共有する

AWSCLIは本当に素晴らしいツールになりました。構成ファイルの形式はほぼ同じなので、次のように使用します。

  1. aWSCLIで作成された~/.aws/configファイルを保持します(これはデフォルトの場所です)
  2. セクション[default]をコピーし、名前を[Credentials]に変更します(内部に同じ値を残します)。
  3. 使用するプロファイルを追加します
  4. このBOTO_CONFIGファイルを指すように~/.aws/config変数を設定します。

~/.botoは、次の内容の `〜/ .aws/configになります。

[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ

これにより、プロファイルを含むAWSCLIとbotoの両方で共有されます。

67
Jan Vlcinsky

http://boto.cloudhackers.com/en/latest/boto_config_tut.html -connect_cloudwatch()を使用する場合botoバージョン2.48.0私は実際に提供する必要がありました

cloudwatch_region_endpoint

または、EC2でインスタンス自体からデータをプッシュする場合(インスタンスがプッシュ先とは異なるリージョンにある場合)、接続は現在のインスタンスと同じリージョンを使用します。

cat .boto
[Boto]
cloudwatch_region_name = us-west-2
cloudwatch_region_endpoint = monitoring.us-west-2.amazonaws.com

それを.aws/credentialsプロファイルに追加しようとしましたが、うまくいかないようでした。

cat .aws/credentials 
[cloudwatch_centralized_reporting]
region = us-west-2
aws_access_key_id = XXX
aws_secret_access_key = XXX
0
storm_m2138