AWS EC2にてyum updateできない場合
EC2にてyum updateできない場合
状況としてはCloudformationにてインフラを構築後にTeratermにてssh接続した後、
yum updateしましたが、installがうまくいかずエラーが発生。yum updateができませんでした。
AWS マネジメントコンソール上でEC2などを作成した場合、特に気にしなくても最低限動くような設定で作成してくれますが、
Cloudformationでインフラ構築をすると、各種設定を自分でしなければなりません。
エラー内容はこちらです。
yum(パッケージ管理システム)が置いてあるミラーリストに接続できていないようです。
接続できていない原因がわからないため調べました。 VPCにエンドポイントなるものを設定しないといけないみたい。
検索するとすぐに記事が出たため、結構よくあるエラーっぽい。
参考にした記事を読んでみましょう。
エンドポイント
Amazon LinuxおよびAmazon Linux2のyumリポジトリは、S3に存在します。 EC2インスタンスが所属しているVPCのエンドポイントが、 S3のyumリポジトリにアクセスできるようにポリシーを設定します。
なるほど。。ポリシー設定が必要なことがわかりました。
早速設定してみましょう!設定方法は記事参照。
設定が終わり、参考にした記事の通りにエンドポイントを作成してもう一度yum updateしてみましたが、ダメでした。
なぜ??もしかしたらルール設定ができていない気もするのでSecurityGroupとNetworkACLのルール確認。
Amazon S3 におけるエンドポイント - Amazon Virtual Private Cloud
SecurityGroup
アウトバウンドルールの見直し。
外側への通信手段がないためhttpを追加。
NetworkACL
デフォルト設定だとすべてのトラフィックを許可しているため問題ないのですが、
cloudformationで作ったときにssh接続のみ許可するようにしていたので、このままだとinstallできません。
というわけでルールを追加します。
カスタムTCPにてポート番号をLinuxのエフェメラルポートに設定。
installが結構遅めだったので1024-65535
にしても良いかも。
dev.classmethod.jp
yum update
実行。
yum update成功しました!
何かしら繋がらない時はSecurityGroupとNetworkACLの設定がおかしい場合が多いですね。
次はCloudformationで自動化していきます。
やることはエンドポイントの作成とポリシーの設定。
cloudformation
エンドポイントの作成の仕方
公式より引用
S3Endpoint: Type: 'AWS::EC2::VPCEndpoint' Properties: PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: '*' Action: - 's3:GetObject' Resource: - 'arn:aws:s3:::examplebucket/*' RouteTableIds: - !Ref routetableA - !Ref routetableB ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3' VpcId: !Ref VPCID
PolicyDoucument
ここに記述していくようです。
ポリシーの設定の仕方を調べました。
PolicyDocument
Policyの設定が必要な場合はPolicyDoumentに記述していく。
今回の場合はS3にアクセスしたいのでポリシーを追加します。
こちらのPolicyDocumentは設定しなければfullAccessとなるため必須ではないですが、fullAccessでなくてよいので追加します。
サービスへのアクセスを制御するエンドポイントにアタッチするポリシー。ポリシーは有効な JSON フォーマットである必要があります。このパラメータを指定しないと、サービスへのフルアクセスを許可するデフォルトのポリシーがアタッチされます。
AWS Policy Generatorにて一度Policyを作成してからGeneratorにて作成したPolicyを参考にしながらcloudformationを作成していくと間違いがなくて良いかもしれません。
エンドポイント→ポリシー→ポリシーの編集
ポリシーの作成ツール
Generate Policyをクリック
こちらのPolicy Jsonを参考にして作成する。
めちゃくちゃわかりやすいですね!
cloudformationコード
エンドポイント
S3Endpoint: Type: "AWS::EC2::VPCEndpoint" Properties: PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Sid: "AmazonLinux2AMIRepositoryAccess" Principal: "*" Action: - "s3:GetObject" Resource: - "arn:aws:s3:::amazonlinux.*.amazonaws.com/*" RouteTableIds: - !Ref PublicRouteTable ServiceName: !Sub "com.amazonaws.${AWS::Region}.s3" VpcId: !Ref VPC
AWS Policy Generatorにて作成したJsonを参考に書いてみましたが、公式ドキュメントに載っていた書き方とほぼ同じでした。
そのため、修正点は二つほど。
Sid: "AmazonLinux2AMIRepositoryAccess"
識別するためのID追加
Resource: - "arn:aws:s3:::amazonlinux.*.amazonaws.com/*"
こちらも同様
正直いらないんじゃないか?程度の修正。 公式ドキュメントすごい!
Amazon リソースネーム (ARN) - AWS 全般のリファレンス
NetworkACL
NetworkACLInboundRule01: Type: AWS::EC2::NetworkAclEntry Properties: NetworkAclId: Ref: NetworkACL Egress: false RuleNumber: 100 Protocol: 6 RuleAction: allow CidrBlock: 0.0.0.0/0 PortRange: From: 22 To: 22 NetworkACLInboundRule02: Type: AWS::EC2::NetworkAclEntry Properties: NetworkAclId: Ref: NetworkACL Egress: false RuleNumber: 101 Protocol: 6 RuleAction: allow CidrBlock: 0.0.0.0/0 PortRange: From: 32768 To: 61000 NetworkACLOutboundRule: Type: AWS::EC2::NetworkAclEntry Properties: NetworkAclId: Ref: NetworkACL Egress: true RuleNumber: 100 Protocol: -1 RuleAction: allow CidrBlock: 0.0.0.0/0
docs.aws.amazon.com
注意点としてはインバウンドか?アウトバウンドか?をEqress
にて指定してあげるくらいだと思います。
Eqressがtrueならアウトバウンド、falseならインバウンドとなる。
これで終了となります!インバウンドとアウトバウンドのルールにかなり詰まったので、もっと学習しないとだめですね。。